2009-07-09 5 views
3

私は多くのコンポーネントを含むパネルを持っています。そのうちの1つはJTableです。 JTableにフォーカスがあり、Tabキーが押されている場合、デフォルトの動作では、テーブル内のセルからセルへフォーカスを移動します。代わりに次のコンポーネントに焦点を合わせるためにこれを変更する必要があります。つまり、JTableを完全にそのままにしておきます。JTableコンポーネント上でのタブ移動

Ctrl-Tabは、望ましい結果を達成しますが、ユーザーは受け入れられません。キーリスナーをテーブルに追加し、Tabキーを押すとフォーカスを変更できますが、これを行うより良い方法があるように感じられます。

アイデア?

おかげで...

+0

私は正しい解決策がここに掲載されていると思う:http://stackoverflow.com/a/12157344/140278 – Daniel

答えて

1

他の責任を負っているため、タブアクションを取り除きたいとは思わないでしょう。たとえば、セルを編集するとき、Tab Actionはセル編集を中止してから次のセルに移動します。したがって、おそらく、この振る舞いを保持しながら、次のコンポーネントにフォーカスを変更する特別な振る舞いを追加したいと思うでしょう。

これを「アクションをラップする」と言います。この例は、Table Tabbingのアクションをご覧ください。 KeyboardFocusManagerを使用してフォーカスを転送するコードを簡単にカスタマイズできるはずです。

4

あなたは通常、コンポーネントのアクションマップにActionを追加し、コンポーネントの入力マップ(以下の例のコード)で、それにキーストロークを結合することによって、これを行うだろう。

tp.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, Collections.<AWTKeyStroke>emptySet()); 

ここでは、完全なサンプルコードです:このイベントは、あなたがフォーカストラバーサルキーとしてタブを削除するには、次の行を追加しますない限り、フォーカス・サブシステムによって消費されるが、これはタブのために動作しません。

public static void main(String[] args) { 
    final JTabbedPane tp = new JTabbedPane(); 

    // Remove Tab as the focus traversal key - Could always add another key stroke here instead. 
    tp.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, Collections.<AWTKeyStroke>emptySet()); 

    KeyStroke ks = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0); 

    Action nextTab = new AbstractAction("NextTab") { 
     public void actionPerformed(ActionEvent evt) { 
      int i = tp.getSelectedIndex(); 
      tp.setSelectedIndex(i == tp.getTabCount() - 1 ? 0 : i + 1); 
     } 
    }; 

    // Register action. 
    tp.getActionMap().put("NextTab", nextTab); 
    tp.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(ks, "NextTab"); 

    tp.addTab("Foo", new JPanel()); 
    tp.addTab("Bar", new JPanel()); 
    tp.addTab("Baz", new JPanel()); 
    tp.addTab("Qux", new JPanel()); 

    JFrame frm = new JFrame(); 

    frm.setLayout(new BorderLayout()); 
    frm.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
    frm.add(new JButton(nextTab), BorderLayout.NORTH); 
    frm.add(tp, BorderLayout.CENTER); 
    frm.setBounds(50,50,400,300); 
    frm.setVisible(true); 
} 
+0

それは私が必要としたヒントだった。なぜTABが機能していないのか分かりませんでしたが、それはFocusPolicyのためだと思いました。 –

関連する問題