2

JComponent.setFocusable(false)Java コンポーネントをフォーカス可能にしないように呼び出すことができることは知っています。しかし、アプリケーションにはそのようにしたいコンポーネントがたくさんあるので、何十ものオブジェクトのすべてでそれを呼び出すよりも簡単な方法があるかどうか疑問に思っていました. 値のようなUIDefaults

KeyListenerアプリケーションがフルスクリーンで実行され、JFrameキーストロークをリッスンしてさまざまなイベントをトリガーする があるため、これを探しています。しかし、私は、または他の追加されたコンポーネントがクリックされるたびJButtonに、フォーカスを取得し、キーイベントがJFrame. したがって、どの子がフォーカスを持っているかに関係なく、単一の親コンテナーによってキーイベントをキャッチするよりエレガントな方法も、私の問題を解決するのに役立ちます。

4

4 に答える 4

3

数十のオブジェクトごとに呼び出すよりも簡単な方法があるかどうか疑問に思っていました。

私は一度も見たことがありません。

JFrame には、キーストロークをリッスンしてさまざまなイベントをトリガーする KeyListener があります。

KeyListener を使用しないでください。

代わりに、アクセラレータで JMenus と JMenuItems を使用できます。このアプローチの利点は、キーストロークがメニューに文書化されることです。How to Use Menusに関する Swing チュートリアルのセクションを参照してください。

または、メニューが気に入らない場合は、Key Bindingsを使用する必要があります。コンポーネントにフォーカスがない場合でも動作するようにコーディングできます。

于 2011-07-28T14:53:14.930 に答える
2

KeyEventDispatcher の仕事のように聞こえます。

http://download.oracle.com/javase/6/docs/api/java/awt/KeyEventDispatcher.html

それは問題を解決することであり、(計算不可能な)副作用を伴う直接関連しないプロパティを修正することではありません:-)

于 2011-07-28T15:18:57.387 に答える
1

どうですか:

public boolean getComponent(Container c)
{
    Component[] cmps = c.getComponents();
    for(Component cmp : cmps)
    {
        if(cmp instanceof JComponent) // or even you could specify the JComponent you want to make it not-focusable, for example (cmp instanceof JButton)
        {
            ((JComponent)cmp).setFocusable(false);
            return true;
        }
        if(cmp instanceof Container)
        {
            if(getComponent((Container) cmp)) return true;
        }
    }
    return false;
}

次に、次のように呼び出します。

getComponent(YourJFrame);
于 2011-07-28T14:57:00.187 に答える
0

これは、ツリーをたどって関心のある要素に設定するかなり大雑把な方法です。noFocus のセットを渡すだけです (またはロジックをすべてに変更します)...

  public static List<Component> disableFocus(final Container c, Set<Component> noFocus) {
    Component[] comps = c.getComponents();
    for (Component comp : comps) {
      if (noFucus.contains(comp) { comp.setFocusable(false); }
      if (comp instanceof Container) {
        disableFocus(comp);
      }
    }
  }
于 2011-07-28T14:57:32.657 に答える