9

JTable のデフォルトの動作はフォーカスを次のセルに変更することであり、TAB キーを押したときにフォーカスを次のコンポーネント (JTextField など) に移動させたいと考えています。のメソッド
をオーバーライドして、常に false を返すよう にしました。isCellEditableDefaultTableModel

public boolean isCellEditable(int rowIndex, int columnIndex) {
    return false;
}

しかし、それでもフォーカスは次のコンポーネントに変わりません! 次のセルではなく、次のコンポーネントにフォーカスを変更する
にはどうすればよいですか?JTable

4

4 に答える 4

13

コンポーネント間でフォーカスを移動するには、デフォルトでシフト/タブ キーが使用されます。JTable は、shift-/tab を内部で処理することを明示的に要求します (それらを含まない focusTraversalKeys のセットを提供することにより)。

一般的なルール (タスクに使用できる特定の API がある場合は、独自の API をローリングする代わりにそれを使用する) に従って、解決策はトラバーサル キーを設定してそれらを再度含めることです。

Set<AWTKeyStroke> forward = new HashSet<AWTKeyStroke>(
        table.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
forward.add(KeyStroke.getKeyStroke("TAB"));
table.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forward);
Set<AWTKeyStroke> backward = new HashSet<AWTKeyStroke>(
        table.getFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS));
backward.add(KeyStroke.getKeyStroke("shift TAB"));
table.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backward);
于 2012-08-28T10:25:30.990 に答える
6

本当にこれが必要な場合は、テーブル アクション マップのデフォルトの動作を変更する必要があります。

ActionMap am = table.getActionMap();
am.put("selectPreviousColumnCell", new PreviousFocusHandler());    
am.put("selectNextColumnCell", new NextFocusHandler());    

次に、トラバーサルを処理するためにいくつかのアクションが必要です

public class PreviousFocusHandler extends AbstractAction {
    public void actionPerformed(ActionEvent evt) {
        KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
        manager.focusPreviousComponent();
    }
}

public class NextFocusHandler extends AbstractAction {
    public void actionPerformed(ActionEvent evt) {
        KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
        manager.focusNextComponent();
    }
}

別のアプローチは、基になるものを無効にすることActionです...

ActionMap am = table.getActionMap();
am.get("selectPreviousColumnCell").setEnabled(false);
am.get("selectNextColumnCell").setEnabled(false);

(これはテストしていません)

このアプローチの利点は、古いものへの参照を維持する必要なく、必要に応じて動作を有効/無効にできることです。Actions

于 2012-08-28T07:58:35.290 に答える
5
于 2012-08-28T07:57:25.527 に答える
4

標準のキーボード バインド (通常は TAB および SHIFT+TAB) にリセットするにはnullkeystrokesパラメーターをComponent.setFocusTraversalKeys次のように指定するだけです。

table.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null);
table.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null);
于 2013-06-20T16:18:02.633 に答える