JTable的默认行为是将焦点更改为下一个单元格,我想强制它将焦点移动到按下的TAB键上的下一个组件(例如JTextField)。
我将isCellEditable
的{{1}}方法改为总是返回false:
DefaultTableModel
但它仍然没有将焦点转移到下一个组件!
我应该如何让public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
将焦点转移到下一个组件而不是下一个组件?
答案 0 :(得分:12)
默认情况下,使用shift / tab键在组件之间传输焦点。 JTable显式请求在内部处理shift- / tab(通过提供不包含那些的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);
答案 1 :(得分:5)
默认(KeyBinding
实施JTable
)是关于下一个单元格,从最后一个单元格到第一个单元格,
答案 2 :(得分:5)
如果你真的想要这个,你需要改变表动作图的默认行为。
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
的引用
答案 3 :(得分:4)
要重置为标准键盘绑定(通常为TAB和SHIFT + TAB),只需为null
keystrokes
参数指定Component.setFocusTraversalKeys
:
table.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null);
table.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null);