2014-11-22 5 views
0

이상한 문제가 있습니다. 재판과 오류 시간이 지나면 문제의 근본 원인을 찾았지만 나에게 의미가 없습니다. keyEvents는 키를 고정시키고 다른 메소드는 Java에서 동일한 메소드를 제대로 호출 할 수 있습니다.

public static void test(){ 
System.out.println("test Method is called"); 
} 

가 나는 키 클래스가 있습니다

나는 다음과 같은 방법이있는 메인 클래스가 있습니다. Keys의 객체는 Main의 객체에 추가됩니다. 키를 누르면 값을 출력

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

public class Keys2 implements KeyListener { 
// Default keys will be able to be changed 
    private int leftKey = 37; // left b. 


public void start() { 
    Main2.main().addKeyListener(this); 
    Main2.main().setFocusable(true); 

} 

public boolean isPressed(int keyCode) { 
    return false; // pressedKeys.contains(keyCode); 
} 

@Override 
public void keyPressed(KeyEvent e) { 
    // non-critical keys: 
    System.out.println(e.getKeyCode()); 
    if (e.getKeyCode() == leftKey) 
     left(); 
} 

@Override 
public void keyReleased(KeyEvent e) { 
} 

@Override 
public void keyTyped(KeyEvent e) {} 

// ======================================================== 
// KEY METHODS 

public void left() { 
    // default left 
    System.out.println("left"); 
    Main2.test(); 
    System.out.println("end"); 
} 

}// END OF THE KEYS CLASS 

:

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Main2 extends JPanel { 
private static Main2 main = new Main2();; 

public static final Main2 main() { 
    return main; 
} 

public static void test() { 
    System.out.println("test Method is called"); 
} 

public final JFrame frame = new JFrame(); 
public final Keys2 keys = new Keys2(); 

// ============================================================== 

public static void main(String[] args) {} 

private Main2() { 
    System.out.println("START"); 
    Main2.main = this; 
    frameInit(); 
    init(); 
    gameLoop(); 
} 

private void init() { 
    keys.start(); 
    //keys.left(); Removing // from this line partially solves the problem. 
} 

private void frameInit() { 
    frame.add(main); 
    frame.setSize(100, 100); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 

private void gameLoop() { 
    while (true) {// Removing while loop solves the problem 
//Code here is omitted due to being irrelevant 
    } 

}// loop end 

} 

키 클래스 메인 2 등급 : 여기

는 최소한의 완전하고 검증 예입니다. 그래서 열쇠가 작동 중입니다. Main 클래스에서 정적 test() 메서드를 호출하기 위해 left() 메서드를 변경했습니다. 지금만큼 내가 왼쪽 버튼을 누르지 않는 한 아무 문제가 없다하지만 난 왼쪽을 누를 때 나는 단지 콘솔에서 다음과 같은 결과를 얻을 :

left 

나도 "말"이나 "테스트 메소드가 불려"입니다을 인쇄. 오류 메시지가 없습니다. 또한 왼쪽 버튼을 누르면 모든 키 메소드가 작동을 멈 춥니 다 (게임 루프가 계속 작동하므로 프로그램이 멈추지 않습니다). 마우스 수신기도 작동을 멈 춥니 다. X 버튼을 클릭하여 JFrame 창을 닫을 수도 없습니다. 내가 주 또는 다른 개체 또는 시작() 메소드에서의 개체에서 왼쪽() 메소드를 호출하면

그러나, 그것은 오류없이 작동하고 콘솔은 다음과 같은 메시지가 가져옵니다

left 
test Method is called 
end 

을 그런 다음 오류없이 왼쪽 버튼을 눌러 동일한 메시지를 얻을 수 있습니다.

왜 그럴까요? 이 문제를 어떻게 해결할 수 있습니까?

편집 : 나는 그럼 난의 주요 방법으로 main= new Main2();을 추가 한 private static Main2 main;

에 내가 private static Main2 main = new Main2();을 변경하여 내 문제를 해결했습니다 MCVE

+0

1) 더 나은 도움을 받으려면 [MCVE] (http://stackoverflow.com/help/mcve) (최소한의 완전한 검증 가능한 예) 또는 [SSCCE] (http://www.sscce.org/) (짧은, 자체 포함, 올바른 예). 2) Swing의 경우 일반적으로 하위 수준 인 KeyListener보다는 [key bindings] (https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)를 사용합니다. –

+0

@AndrewThompson 나는 내가 모르는 뭔가가 분명히 있었으면 좋겠다. 나는 하나를 만들려고 노력할 것이다. – WVrock

+0

'Main.main()'이란 무엇입니까? 'Main' 유형의 객체를 얻으려면'main mainObj = new Main();'에 무엇이 잘못 되었습니까? 그리고 그것을 정적으로 만들고 싶다면, 그러한 메소드의 선호 된 명명 규칙은'getInstance()'이다. 코드가 완전하지 않습니다. – hfontanez

답변

0

내 코드를 교체했습니다. 이 문제가 해결되었습니다. 왜, 어떻게? 나는 가장 희한한 생각이 없다.

+0

나는 왜 이것이 내 문제를 해결하는지 설명 할 수있는 대답을 받아 들일 것입니다. – WVrock

+1

[* 초기 스레드 *] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)도 참조하십시오. – trashgod