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
클래스를 듣기 위해 별도의 스레드가 있어야합니까?
추신. 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
가능한 중복 [키 리스너 대신 키 바인딩을 사용하는 방법] (0120-388-333) – user1803551