2011-12-10 51 views
0

以下是一個顯示黑屏的程序ALARM!爲什麼按下的鍵不會觸發任何事件?

import java.awt.*; 
import javax.swing.*; 
import java.awt.event.*; 


public class displayFullScreen extends Window { 
    private JLabel alarmMessage = new JLabel("Alarm !"); 

    public displayFullScreen() { 
     super(new JFrame()); 
     setLayout(new FlowLayout(FlowLayout.CENTER)); 
     alarmMessage.setFont(new Font("Cambria",Font.BOLD,100)); 
     alarmMessage.setForeground(Color.CYAN); 
     add(alarmMessage); 
     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     setBounds(0,0,screenSize.width,screenSize.height); 
     setBackground(Color.black); 

     addKeyListener(new KeyAdapter() { 
      @Override 
      public void keyPressed(KeyEvent ke) { 
       escapeHandler(ke); 
      } 
     }); 
    } 

    public void escapeHandler(KeyEvent ke) { 
     if(ke.getKeyCode() == ke.VK_ESCAPE) { 
      System.out.println("escaped !"); 
     } else { 
      System.out.println("Not escaped !"); 
     } 
    } 

    public static void main(String args[]) { 
     new displayFullScreen().setVisible(true); 
    } 
} 

我在這個程序中設置了一個按鍵處理程序。處理程序捕獲焦點在窗口上時按下的鍵。 當按下退出鍵時escaped !應顯示爲!escaped。 但是當我按下某個鍵時,什麼都不顯示。問題是什麼 ?

回答

4

也許你想要一個窗口,但你有兩個問題:

  1. 使用Swing應用程序
  2. 時,您應該擴展的JWindow,不是窗口
  3. 甚至延續的JWindow不會起作用,因爲創建JWindow將不會收到KeyEvent,除非它是父JFrame是可見的。

所以你應該使用JFrame。如果你不想要標題欄和邊框,那麼你可以使用未裝飾的JFrame。

另外,您不應該使用KeyListener,因爲即使在JFrame上,關鍵事件也只會分派給所關注的組件。相反,你應該使用Key Bindings。在這種情況下,您應該將綁定添加到框架的根窗格。

+0

另一種方法是將偵聽器添加到每個組件,這個類似問題的解決方案如下所示:http://stackoverflow.com/questions/286727/ java-keylistener-for-jframe-is-being-responsive –

+1

@ChipMcCormick,不,這不是一個好的解決方案。正如我已經指出,不應該使用KeyListener。 Swing被設計爲與鍵綁定一起使用。 – camickr

1

改爲擴展JFrame並擺脫超級通話。

+0

我爲什麼要當我想要窗戶?我希望你瞭解這個區別 –

+0

我猜你可以讓這個窗口工作。您只需要將偵聽器添加到傳遞給超級構造函數的框架 –

相關問題