3

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

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

何か案は?

ありがとう...

4

2 に答える 2

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);
}
于 2009-07-09T15:08:25.570 に答える
1

タブアクションには他の責任があるため、タブアクションを削除したくない場合があります。たとえば、セルを編集している場合、タブアクションは次のセルに移動する前にセルの編集を停止します。したがって、フォーカスを次のコンポーネントに変更するための追加の動作を追加しながら、この動作を維持したい場合があります。

私はこれを「アクションのラッピング」と呼んでいます。この例は、テーブルタブアクションを確認することで見つけることができます。KeyboardFocusManagerを使用してフォーカスを転送するようにコードを簡単にカスタマイズできるはずです。

于 2009-07-09T16:20:07.750 に答える