3

keylistenerプログラムを終了するには、エスケープキーが押されるのを常に「リッスン」する必要があります。

addKeyListener(this);メインコンストラクター(パネルが描画されているコンストラクター)を入力してみ ました。

public void keyPressed( KeyEvent e)

{
      int code = e.getKeyCode();
      if(code == KeyEvent.VK_ESCAPE)
      {
           System.exit( 0 );
      }


}

エラーは発生しませんが、Escキーを押しても何も起こらないようです。何か提案はありますか?

4

3 に答える 3

2
  • Top-Level ContainerKeyEventデフォルトではから受信することはありませんKeyListenerが、いくつかのコード行、間違ったアイデア、間違ったリスナーで可能です

  • JPanelデフォルトでは に反応しますが、 が であるKeyEvent場合のみ、間違ったアイデア、間違ったリスナー (たとえば)からにプログラム的に移行する必要があったため、間違ったアイデアisFocusableFocusOwnerFocusJTextFieldJPanel

  • / /に追加KeyBindings、デフォルトでアクセス可能、 forではなくJFrameJDialogJWindowSwing JComponentAWT Components

于 2013-03-12T12:44:17.523 に答える
1

InputMap/ActionMapメカニズムを使用できます。

    Object escapeActionKey = new Object();
    pnl.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("ESCAPE"), escapeActionKey);
    pnl.getActionMap().put(escapeActionKey, new AbstractAction() {
        public void actionPerformed(ActionEvent e) {
            System.err.println("escape 1");
        }
    });

JComponent.WHEN_IN_FOCUSED_WINDOWpnlこれは、コンポーネントがフォーカスされたウィンドウにあるときにこのキーストロークを使用できることを意味します。

または、グローバルAWTEventListenerリスナーを追加することもできます。

    Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
        public void eventDispatched(AWTEvent event) {
            if(event.getID() == KeyEvent.KEY_PRESSED) {
                KeyEvent kEvent = (KeyEvent) event;
                boolean isEsc = (kEvent.getKeyCode() == KeyEvent.VK_ESCAPE);
                if(isEsc) {
                    System.err.println("escape 2");
                }
            }
        }
    }, AWTEvent.KEY_EVENT_MASK);
于 2013-03-12T13:15:10.677 に答える
0

Swingには、トップレイヤーパネルがあります。GlassPaneは、トップレベルでイベントを処理できます(他のウィジェットがイベントを消費するのを防ぐため)。

于 2013-03-12T12:45:43.713 に答える