2014-11-22 52 views
0

我遇到了一個奇怪的問題。經過數小時的試用和錯誤,我發現問題的根源,但它對我沒有任何意義。keyEvents凍結了鍵值,而其他方法可以在Java中正確調用相同的方法

我有一個主類,其具有以下的方法:

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

我有一個鍵類。 Keys的一個對象被添加到Main的一個對象中。

這裏是最小完備可驗證實施例: MAIN2類

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 

} 

密鑰類別:

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 

按下鍵打印的值。所以鍵正在工作。請注意,我已經改變了left()方法來調用Main類中的靜態test()方法。現在,只要我不按左鍵是沒有問題的,但是當我按下左我只得到在控制檯以下結果:

left 

既不是「結束」,也不是「測試方法被稱爲」是打印。沒有錯誤消息。同樣按下左鍵後,所有按鍵方法停止工作(遊戲循環仍然有效,所以程序不會被凍結)。鼠標監聽器也停止工作。我甚至無法通過單擊X按鈕來關閉JFrame窗口。

但是如果我叫左()方法從主或其他物體,甚至從start()方法的對象,它的工作原理沒有錯誤和控制檯得到以下信息:

left 
test Method is called 
end 

之後,我可以毫不猶豫地按下左鍵並獲得相同的信息。

這是什麼原因?我怎樣才能解決這個問題?

編輯:我已經取代我的代碼有MCVE

+0

1)爲了更快地獲得更好的幫助,請發佈[MCVE](http://stackoverflow.com/help/mcve)(最小完整可驗證示例)或[SSCCE](http://www.sscce.org/) (簡短,獨立,正確的例子)。 2)對於Swing,我們通常使用[鍵綁定](https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)而不是較低級別的'KeyListener'。 – 2014-11-22 09:08:10

+0

@AndrewThompson我希望有一些明顯的東西我不知道。我會嘗試製作一個。 – WVrock 2014-11-22 09:31:18

+0

什麼是'Main.main()'?如果你想得到一個'Main'類型的對象,'Main mainObj = new Main();'有什麼問題?而且,如果你想使它成爲靜態的,這種方法的首選命名約定是'getInstance()'。你的代碼不完整。 – hfontanez 2014-11-22 10:00:34

回答

0

我已經改變private static Main2 main = new Main2();固定我的問題到private static Main2 main;

然後我添加main= new Main2();到的主要方法。這解決了這個問題。爲什麼和如何?我沒有最微不足道的想法。

+0

我會接受任何能解釋我爲什麼解決我的問題的答案。 – WVrock 2014-11-22 11:07:22

+1

參見[*初始線程*](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html)。 – trashgod 2014-11-22 12:13:05

相關問題