2010-06-10 73 views
1

在Java中,我將一個KeyListener添加到JWindow,但它沒有得到任何關鍵事件。如果我使用相同的代碼,而是擴展一個JFrame,那麼一切正常。將KeyListener添加到JWindow中,沒有得到任何關鍵事件

public class MyWindow extends JWindow { 
    ... 
    ... 
    private void initComponents() { 
     ... 
     ... 
     addKeyListener(new KeyListener() { 
      public void keyPressed(KeyEvent e) { 
       System.out.println("KEY PRESSED: " + e.getKeyCode()); 
      } 

      public void keyReleased(KeyEvent e) { 
       System.out.println("KEY RELEASED: " + e.getKeyCode()); 
      } 

      public void keyTyped(KeyEvent e) { 
       System.out.println("KEY TYPED: " + e.getKeyCode()); 
      } 

     }); 
    } 
} 

任何人都知道我可以通過使用JWindow來解決這個問題嗎?

請注意,我使用的是Linux,所以我不確定它是否與平臺有關。

感謝

+0

爲什麼要使用JWindow而不是JFrame? (我很好奇,我希望不是因爲裝飾) – OscarRyz 2010-06-11 00:51:48

回答

1

您可以通過添加ListenerJWindow內容窗格,您可以從window.getContentPane().addKeyListener(..)獲得,看看它的工作原理嘗試。

問題可能在於,如果您有一些注意力集中在JWindow之內,但它不是JWindow本身的事件將被分派到內部關注的項目。您也可以通過添加KeyListener,無論你已經是窗口內得到了嘗試..

編輯: 搜索一點點Sun's forum看來,強迫接受集中了JWindow API你可能做的是

JWindow myWindow = ... 
myWindow.setFocusableWindowState(true); 
myWindow.setFocusable(true); 

,如果它仍然無法正常工作最好的解決辦法是使用JFrame

public class WindowTest { 
    public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    // remove menu bar and title bar 
    frame.setUndecorated(true); 
    frame.setVisible(true); 
    JWindow window = new JWindow(frame); // this works 
    window.setBounds(0, 50, 200, 200); 
    window.setVisible(true); 
    } 
} 

EDIT2:一個複雜的解決方案可能是得到ActionMapgetActionMap()然後添加一個動作爲所有的鍵盤按鍵,只是bufferizes它,那麼你就可以發貨,只要你想(回車鍵後,例如)

+0

我已經嘗試使用getContentPane()添加它。至於是否有重點的可能性,我嘗試了一個空的JWindow,問題仍然存在。一旦我切換到JFrame或JDialog而沒有任何進一步的改變,監聽器似乎工作。 – Untitled 2010-06-11 00:21:08

+0

雖然它不起作用。我剛剛在我的Linux機器上試過 – OscarRyz 2010-06-11 01:00:27

+0

@Support - 多語言SO:我很驚訝。你關於擴展'JWindow'的問題依然存在。 – trashgod 2010-06-11 01:21:49

-1

我也有一模一樣的問題......,我的解決辦法是,在一個班級我的包我伸出的JFrame,其上的按鍵偵聽器完美的作品,並在paint方法,我用了window{Graphics g=win.getGraphics();}的圖形實例...我畫了窗口中的所有內容n不在JFrame上...在此之前,我已撥打了gd{graphicsdevice}.setFullScreenWindow(win);