5

JMenuItem なしで JMenu (exitMenu という名前のインスタンス) を挿入したので、プログラムに JMenu オブジェクトが 1 つしかないため、不要なメニュー項目にアクセスせずにプログラムを終了する方法を利用できるようにすることを目的としています (誰かが言うかもしれません: WTF! !! しかし...)。

したがって、この特定の JMenu コンポーネントで発生したイベントをキャプチャするために、私のクラスは MenuListener インターフェイスを実装します。誰もが知っているように、必須の実装メソッドが 3 つありますが、使用する必要があるのは menuSelected() メソッドの 1 つだけです。

私のプログラムを少し直感的にするために、間違いなく、ユーザーが exitMenu を選択すると、(悪名高い) ポップアップ JOptionPane.showConfirmDialog() が、YES または NO オプションのどちらかを選択する必要がある場所に表示されます。

選択したオプションが YES の場合、プログラムは System.exit(0) によって終了するため、まったく問題ありません。問題は NO オプションです。フォーカスがプログラムに戻ったとき、exitMenu は以前に選択したので、もちろん選択されたままです。私がしたい「こと」は、NOオプションが選択された直後にオブジェクトの選択を削除することです。これにより、ユーザーはそれを再度クリックできるようになります。

3 つの必須メソッド (別の呼び出し) 内で exitMenu.setSelected(false) を使用しても、exitMenu コンポーネントは「選択解除」されていますが、イベント リスナーを呼び出すには、それを 2 回クリックする必要があります。

なにか提案を?

前もって感謝します。

4

2 に答える 2

6

私が試みたことの 1 つは、単純setSelected(false)に menuSelected(...) メソッド内から呼び出すことですが、これには副作用があります。1 つはメニューが選択されていないように見えること、もう 1 つは常に機能しないことです。

機能する解決策の 1 つは、スイング タイマーのメニューを選択解除することです。何かのようなもの:

     @Override
     public void menuSelected(MenuEvent mEvt) {
        // show JOptionPane
        // if yes selected, exit. 

        // Otherwise...
        final JMenu menu = (JMenu) mEvt.getSource();
        new Timer(200, new ActionListener() {

           @Override
           public void actionPerformed(ActionEvent e) {
              menu.setSelected(false);
              ((Timer)e.getSource()).stop();
           }
        }).start();
     }
于 2012-04-16T21:58:20.427 に答える
2

2つのレベルがあります。

  • JMenuがあるMenuListener

  • JMenuItemがあるButtonModel

于 2012-04-17T06:54:25.720 に答える