2011-12-14 4 views
13

के लिए काम नहीं करता है, मैं एक गेम इंजन बनाने की कोशिश कर रहा हूं। मैंने गेम क्लास बनाया है लेकिन त्रुटि KeyBoard क्लास में रहती है। यहां मैं कुछ कोड छोड़ देता हूं।addKeyListener() JPanel

कक्षा :: खेल

package transfer2pc.co.cc.game.tileengine; 

import java.awt.Graphics; 
import java.util.HashMap; 

import javax.swing.JPanel; 

import transfer2pc.co.cc.game.tileengine.input.KeyBoard; 

public abstract class Game extends JPanel implements Runnable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 640206679500196209L; 

    HashMap<String, ?> maps = null; 

    KeyBoard keyBoard = null; 

    public Game(){ 
     super(); 
     keyBoard = new KeyBoard(this); 
     setKeyBoard(keyBoard); 
     Thread th = new Thread(this); 
     th.start(); 
    } 

    public void run(){ 
     while(true){ 
      repaint(); 
      try { 
       Thread.sleep(30); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    @Override 
    public void paint(Graphics g){ 

    } 

    public void addMap(){ 

    } 

    public void setMap(){ 

    } 

    public abstract void keyPressed(int code); 

    public abstract void keyReleased(int code); 

    public abstract void keyTyped(int code); 

    public void setKeyBoard(KeyBoard key){ 
     addKeyListener(key); 
    } 

} 

कक्षा :: कुंजीपटल

package transfer2pc.co.cc.game.tileengine.input; 

import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 

import transfer2pc.co.cc.game.tileengine.Game; 

public class KeyBoard extends KeyAdapter implements KeyListener { 

    Game game = null; 

    public KeyBoard(Game gm){ 
     this.game = gm; 
    } 

    @Override 
    public void keyPressed(KeyEvent e) { 
     System.out.println("KeyPressed"); 
     game.keyPressed(e.getKeyCode()); 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
     game.keyReleased(e.getKeyCode()); 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
     game.keyTyped(e.getKeyCode()); 
    } 

    public static char getChar(int key){ 
     return (char)key; 
    } 

} 

कक्षा :: KeyTest

package transfer2pc.co.cc.game.tileengine.test; 

import java.awt.Graphics; 

import javax.swing.JFrame; 

import transfer2pc.co.cc.game.tileengine.Game; 
import transfer2pc.co.cc.game.tileengine.input.KeyBoard; 

public class KeyTest extends Game { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 8557676950779023327L; 

    char pressed; 

    public KeyTest(){ 
     super(); 
     addKeyListener(new KeyBoard(this)); 
    } 

    @Override 
    public void keyPressed(int code) { 
     pressed = KeyBoard.getChar(code); 
    } 


    @Override 
    public void keyReleased(int code) { 

    } 


    @Override 
    public void keyTyped(int code) { 

    } 

    @Override 
    public void paint(Graphics g){ 
     g.drawString("You pressed: "+pressed, 20, 20); 
    } 

    public static void main(String[] args){ 
     JFrame frame = new JFrame("KeyTest"); 
     frame.setSize(640, 480); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 
     frame.add(new KeyTest()); 
     frame.setVisible(true); 
    } 

} 

लेकिन त्रुटि कोई अपवाद नहीं फेंक दिया और इनपुट प्रतिसाद नहीं था था पढ़ा नहीं जा रहा है। क्या कोई मुझे यह करने का सही तरीका कह सकता है ..

+1

1) जल्द से जल्द बेहतर सहायता के लिए, एक [एसएससीसीई] (http://sscce.org/) पोस्ट करें। 2) महत्वपूर्ण घटनाओं को सुनने से पहले एक घटक को ध्यान देने योग्य होना चाहिए। 3) यदि किसी पैनल में पेड़ या तालिकाओं जैसी चीज़ें होती हैं, तो वे घटक महत्वपूर्ण घटनाओं का उपभोग करेंगे। 4) आमतौर पर 'KeyListener' पर कुंजी बाइंडिंग का उपयोग करने की अनुशंसा की जाती है। 5) 'थ्रेड.sleep (30); 'ऐसा मत करो। मैंने पिछले 2 दिनों में इस 3 बार चर्चा की होगी। क्यों के लिए मेरी पोस्ट और टिप्पणियां खोजें। –

उत्तर

38

बस, आपके पैनल को ध्यान केंद्रित करने की आवश्यकता है।

panel.setFocusable(true); 
panel.requestFocusInWindow(); 

यहाँ एक SSCCE (मैं पूछ सुझाव देते हैं कि भविष्य में इनमें से किसी एक के साथ प्रश्न) बताया गया है:: भी आप पैनल बनाने में जोड़े

import java.awt.Dimension; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class SimpleKeyTest { 

    public static void main(String[] args) { 

     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       JPanel panel = new JPanel(); 

       frame.getContentPane().add(panel); 

       panel.addKeyListener(new KeyListener() { 

        @Override 
        public void keyTyped(KeyEvent e) {} 

        @Override 
        public void keyReleased(KeyEvent e) {} 

        @Override 
        public void keyPressed(KeyEvent e) { 
         System.out.println("Pressed " + e.getKeyChar()); 
        } 
       }); 

       panel.setFocusable(true); 
       panel.requestFocusInWindow(); 

       frame.setSize(new Dimension(300, 300)); 
       frame.setVisible(true); 
      } 

     }; 

     SwingUtilities.invokeLater(r); 

    } 
} 
इसके अलावा

, https://www.google.com/search?q=jpanel+keylistener

+1

* "क्या आप कह सकते हैं कि एसएससीई क्या है" * मैं कर सकता था, लेकिन मैंने इसे कई बार कहा है कि अंत में मैंने इसे एक वेब पेज पर रखा है। वही वेब पेज पहले से ही इस धागे में * दो बार * जुड़ा हुआ है। दस्तावेज़ के लिंक का पालन करें। इसे सब पढ़ें। पूछें कि क्या कुछ स्पष्ट नहीं है। –

2

आप जोड़ सकते हैं JFrame के लिए मुख्य श्रोता, यह कुछ ऐसा है जो मैंने पहले किया था। शायद यह एक अच्छा विचार नहीं है हालांकि यदि आपके पास JFrame में अन्य घटक हैं।

+1

मेरे पास फ्रेम में कोई घटक नहीं है लेकिन जेपीनल मुझे सूट करते हैं क्योंकि उन्हें एप्लेट्स में इस्तेमाल किया जा सकता है। –

+1

मुझे विश्वास है कि आप इसे एप्लेट/जेप्लेट में भी जोड़ सकते हैं, लेकिन मुझे समझ में आता है कि आप जेपीनल में कोड क्यों रखना चाहते हैं – MadcoreTom

संबंधित मुद्दे