JPanel
が作成された場所とは異なるクラスであるキーを聴くスレッドを作成しようとしています。以下は、JPanel
のクラスです。以下はクラス内のaddKeyListenerを使用して、別のクラスのキーをリッスンしますか?
public class Game extends JPanel {
public static final int WIDTH = 600,
HEIGHT = 650;
private static boolean running;
private BufferedImage image;
private Graphics2D g;
public String str;
private static Thread MyThread;
public Game() {
super();
setPreferredSize(new Dimension(WIDTH, HEIGHT));
setFocusable(true);
requestFocus();
}
public void addNotify(){
super.addNotify();
MyThread myThread = new MyThread(this);
if(myThread == null){
myThread = new Thread(myThread);
myThread.start();
}
}
public void run() {
image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
g = (Graphics2D) image.getGraphics();
while(running){
update();
render();
draw();
System.out.println(str);
}
stop();
}
private void update(){ }
private synchronized void render(){
g.setColor(Color.BLACK);
g.fillRect(0, 0, WIDTH, HEIGHT);
}
private synchronized void draw(){
Graphics g2 = this.getGraphics();
g2.drawImage(image, 0, 0, null);
g2.dispose();
}
public void start(){
if(running) return;
running = true;
run();
}
private void stop() {
if(!running) return;
running = false;
try{
myThread.join();
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
Game
クラスにリッスンスレッドコードです:私は、コードを実行したとき、私は左クリックしてください場合でも
public class MyThread implements Runnable, KeyListener{
private static Game game;
private static boolean left, right;
public MyThread(Game game) {
this.game = game;
}
@Override
public void run() {
game.addKeyListener(this);
if(left){game.str = "left";}
if(right){game.str = "right";}
}
@Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if(key == KeyEvent.VK_LEFT){left = true;}
if(key == KeyEvent.VK_RIGHT){right = true;}
}
@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if(key == KeyEvent.VK_LEFT){left = false;}
if(key == KeyEvent.VK_RIGHT){right = false;}
}
@Override
public void keyTyped(KeyEvent e) {
}
}
は現在、それが唯一のnull
を出力をし、右矢印キー。 run()
メソッドにgame.str = "string";
を挿入しようとしましたが、コンソールはstring
を出力してスレッドが機能します。問題は、MyThread
がJPanel
を聞いていないということです。 Game
クラスを聞く別のスレッドを持つことで、どうすればこの問題を解決できますか教えてください。
PS。 game.addKeyListener(this)
は、MyThread
クラスのrun()
メソッドにあります。
私は非常だろう'KeyListener'を介してKey Bindings APIを使うことをお勧めします。これは' KeyListener' APIに関連したいくつかの問題を解決します - [Key Bindingsの使い方]を参照してください(http://docs.oracle.com/javase/tutorial /uiswing/misc/keybinding.html) – MadProgrammer
あなたの 'KeyListener'は' Game'クラスに関連付けられた状態を更新するのではなく、それ自身を更新する必要があります。 – MadProgrammer
可能な複製[キーリスナーの代わりにキーバインディングを使用する方法](http://stackoverflow.com/questions/22741215/how-to-use-key-bindings-instead-of-key-listeners) – user1803551