2011-01-16 13 views

答えて

10

JRootPaneには、必要な操作を行うメソッドsetDefaultButton(JButtonボタン)があります。あなたのアプリケーションがJFrameの場合は、RootPaneContainerインターフェイスを実装し、JFrameのgetRootPane()を呼び出してルートペインを取得し、返されたルートペインでsetDefaultButtonを呼び出します。同じテクニックは、JApplet、JDialog、またはRootPaneContainerを実装する他のクラスでも機能します。

+0

これは、.getRootPane()を使用する予定のコンポーネントを初期化した後でのみ機能しますか?もしそうなら、それは私がそのコンポーネントのコンストラクタに直接組み込むことができなかったことを意味します、はい? –

+0

@LucasMorgan:これを動作させるにはJRootPaneが必要です。意味があります。それ以外の場合は、キーバインディングを使用する必要があります。 –

2

ActionListenersを削除します。それはリスナーをやるための古いスタイルです。 Actionクラスへの卒業生。そのトリックは、InputMapsとActionMapsの動作を理解することです。これは実際にはかなりいいですスイングのユニークな特徴である:

http://download.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

は、ここであなたがそれを行う方法は次のとおりです。WHEN_ANCESTOR_OF_FOCUSED_COMPONENTを使用して

JPanel panel = new JPanel(); 
panel.setLayout(new TableLayout(...)); 
Action someAction = new AbstractAction("GO") { 
    public void actionPerformed() { 
    } 
}; 

InputMap input = panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); 

input.put(KeyStroke.getKeyStroke("enter", "submit"); 
panel.getActionMap().put("submit", someAction); 

panel.add(button = new JButton(someAction)); 
panel.add(textField = new JTextField()); 

は、パネルはそれの子のいずれかからキーボードイベントを受け取ることができます(すなわち祖先)。したがって、パネル内にある限り、どのコンポーネントにフォーカスがあっても、キーストロークはActionMapで「submit」の下に登録されたアクションを呼び出します。

メニュー、ボタン、またはキーストロークでアクションを再利用することができます。

+0

Key Bindingは多くの状況で便利ですが、提供される他のよりシンプルなソリューション(バックグラウンドでキーバインディングを使用する可能性が高い)を使用すると、現在の問題のために少し残虐ではありません。 –

+0

これはダイアログまたはそれ自体がメインUIであるかどうかを作者が指定していないかどうかによって異なります。 setDefaultButton()を使うと、それがダイアログ上で唯一のものとみなされます。アクションを理解し、Swingツールキットの他の部分とどう関係しているかは、メニューバインディング、グローバルキーストローク、およびデフォルトコンポーネントのキーマッピングのカスタマイズなど、他のトピックに詳しく説明します。さらに、ActionListenersを使用する人はすべて、アクションが優れていることを認識する必要があります。 – chubbsondubs

+0

"ActionListenersを使用している人はすべて、アクションが優れていることを認識する必要があります。すべての一般化が間違っていると私は教えられました。 :) –

関連する問題