JTable的默认行为的改变重点,下一个单元格,我想迫使它在按下TAB键将焦点移到下一个组件(如JTextField中)。
我overrided isCellEditable
方法DefaultTableModel
总是返回false:
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
但它仍然不会改变焦点的下一个组件!
我应该怎么做JTable
焦点转到下一个组件,而不是下一个单元格?
如果你真的想这样,你需要更改表动作映射的默认行为。
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
该倒班/选项卡的密钥组件之间的transfering焦点默认使用。 JTable的明确请求在内部处理的倒班/选项卡(通过提供套不包括那些focusTraversalKeys的)。
按照一般规则( 如果有新疆特色可用的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);
要重置为标准键盘绑定(通常TAB和SHIFT + TAB),只需指定null
的keystrokes
参数Component.setFocusTraversalKeys
:
table.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null);
table.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null);