1

Nimbusが何らかの形でVirtual keysと競合するのはなぜだろうと思っていました。以下に作成したサンプルを確認してください。

    public class buttontest implements ActionListener {

    JMenuItem close =new JMenuItem("Close");

    public static void main (String[] args){

    try {
        for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
            if ("Nimbus".equals(info.getName())) {
                UIManager.setLookAndFeel(info.getClassName());
                break;
            }
        }
    } catch (UnsupportedLookAndFeelException e) {
        // handle exception
    } catch (ClassNotFoundException e) {
        // handle exception
    } catch (InstantiationException e) {
        // handle exception
    } catch (IllegalAccessException e) {
        // handle exception
    }

    }

    public buttontest(){

    JFrame test = new JFrame();
    JMenuBar bar=new JMenuBar();
    JMenu file=new JMenu("File");

    close.setMnemonic(KeyEvent.VK_C);
    file.setMnemonic(KeyEvent.VK_F);

    test.setExtendedState(test.getExtendedState() | test.MAXIMIZED_BOTH); // Maximized Window or setSize(getMaximumSize())
    test.setDefaultCloseOperation(1);

    bar.add(file);
    file.add(close);
    test.setJMenuBar(bar);
    test.setVisible(true);  
}

public void actionPerformed(ActionEvent e){

    if(e.getSource()==close){
        System.exit(0);
    }
}

}

書かれているように、仮想キーを使用することができます。Alt F は [ファイル] メニューを開くために機能しますが、Alt C はアプリケーションを閉じません。逆に、Nimbus コードにコメントを付けると、両方の仮想キーが機能します。

私はこの「バグ」(または、私が気付いていない何か間違ったことをしている可能性があります)に関して1つの調査を行いましたが、今まで何も見つかりませんでした. 誰かがこれを通過したことがありますか?

4

1 に答える 1

3

setAccelerator()次のメソッドを使用する必要がありますJMenuItem

close.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.ALT_MASK ));

Javadoc から:
JMenuItem#setAccelerator(KeyStroke)

メニュー階層を移動せずにメニュー項目のアクション リスナーを呼び出すキーの組み合わせを設定します。正しいアクションをインストールするのは UI の役割です。キーボード アクセラレータを入力すると、メニューが現在表示されているかどうかに関係なく機能することに注意してください。


追記:

  1. 内部の内部クラスであるLookAndFeelInfoためUIManager.LookAndFeelInfo、 に置き換えます。UIManager

  2. mainメソッドでコンストラクターを呼び出します。

  3. のパラメータsetDefaultCloseOperation(1)を 3 に変更しますが、フレームを非表示にしますが、個人的には嫌いです。Skype のようにフレームを3 = JFrame.EXIT_ON_CLOSE表示にするのではなく、フレームを閉じる1=JFrame.HIDE_ON_CLOSEために閉じるボタンが作成されるためです。

  4. 閉じるボタンにactionListenerを追加します。close.addActionListener(this);

于 2013-07-26T15:36:12.747 に答える