【问题标题】:Change focus to next component in JTable using TAB使用 TAB 将焦点更改到 JTable 中的下一个组件
【发布时间】:2012-08-28 07:35:59
【问题描述】:

JTable 的默认行为是将焦点更改为下一个单元格,我想强制它在按下 TAB 键时将焦点移动到下一个组件(例如 JTextField)。
我覆盖了DefaultTableModel 的isCellEditable 方法以始终返回false:

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

但它仍然不会将焦点转移到下一个组件!
我应该如何让JTable 将焦点更改为下一个组件而不是下一个单元格?

【问题讨论】:

  • 我们是在谈论焦点 1) 在 JTable 中的单元格之间 2) 将焦点从 JTable 移动到(例如)JTextField,反之亦然
  • @mKorbel: #2 ,JTable 的默认行为是将焦点更改为下一个单元格,我想强制它在按下 TAB 键时将焦点移动到下一个组件(例如JTextField)。

标签: java swing focus jtable focusmanager


【解决方案1】:

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);

【讨论】:

  • 是的,我不知道这个。
【解决方案2】:

如果你真的想要这个,你需要更改表格操作映射的默认行为。

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 的引用

【讨论】:

  • ?键盘焦点管理器?本来要提到 Componet.transferFocusXXX(),但要打嗝 4 个月:P
【解决方案3】:

【讨论】:

    【解决方案4】:

    要重置为标准键盘绑定(通常是 TAB 和 SHIFT+TAB),只需将 null 指定为 keystrokes 参数到 Component.setFocusTraversalKeys:

    table.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, null);
    table.setFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, null);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      相关资源
      最近更新 更多