当前位置: 首页 > 知识库问答 >
问题:

JTabbedPane焦点遍历策略

薛寒
2023-03-14

我有一个JTabbed面板,它有4个选项卡。每个选项卡都有一个 JTable。我正在尝试为JTabbedPane设计一个自定义的焦点移动策略,这样当我专注于表格的最后一个单元格时,按Tab会将我带到下一个标签。我已经搜索了很多,但没有找到我可以使用的特定内容。

tabbedPane.setFocusCycleRoot(true);
tabbedPane.setFocusTraversalPolicyProvider(true);
tabbedPane.setFocusTraversalPolicy(new MyPanelFocusTraversalPolicy(tabbedTables));

以下是我的自定义焦点遍历策略。

    private class MyPanelFocusTraversalPolicy extends FocusTraversalPolicy{
        private Vector<Component> order;
        public StateWithholdingPanelFocusTraversalPolicy(List<CopyWorkerSingleTablePanel> table){
            this.order = new Vector<Component>(table.size());
            this.order.addAll(table);
        }
        @Override
        public Component getComponentAfter(Container aContainer, Component aComponent) {
            return order.get(order.indexOf(aComponent)+1);
        }

        @Override
        public Component getComponentBefore(Container aContainer, Component aComponent) {
            return order.get(order.indexOf(aComponent)-1);
        }

        @Override
        public Component getFirstComponent(Container aContainer) {
            return order.get(1);
        }

        @Override
        public Component getLastComponent(Container aContainer) {
            return order.lastElement();
        }

        @Override
        public Component getDefaultComponent(Container aContainer) {
            return order.get(0);
        }
    }

此外,这些JTables正在其他地方实例化,我已经覆盖了Tab键绑定,以便在最后一个单元格上专注于下一个组件。我这样做也是为了给我在其他屏幕上提供实用程序

    KeyStroke keyStroke = KeyStroke.getKeyStroke("TAB");
            Object actionKey = copyWorkerTable.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).get(keyStroke );
            final Action action= table.getActionMap().get(actionKey);
            Action wrapper = new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if(table.getSelectedRow() >= table.getRowCount()-1 && table.getSelectedColumn() >= table.getColumnCount()-1) {                      
                        if(!table.isCellEditable(table.getSelectedRow(),table.getSelectedColumn())){
                            table.transferFocus();
                        }else{
                            table.getCellEditor(table.getSelectedRow(),table.getSelectedColumn()).stopCellEditing();
                            table.transferFocus();
                        }

                    }else{
                        action.actionPerformed(e);
                    }
                }
            };

共有1个答案

子车飞文
2023-03-14

如果我没弄错,你为什么不在你的动作处理程序中使用类似这样的东西来在选项卡之间导航呢?

if (tabbedPane.getSelectedIndex() == (tabbedPane.getComponentCount() - 1))
    {

        tabbedPane.setSelectedIndex(0);

    } else
    {

        tabbedPane.setSelectedIndex(tabbedPane.getSelectedIndex() + 1);

    }
 类似资料:
  • 问题内容: JavaFX是否可以像AWT一样更改 焦点遍历策略 ? 因为我的两个ES 的遍历顺序是错误的。 问题答案: 在通常情况下,导航以容器顺序,子顺序或按箭头键进行。您可以更改节点的顺序-在这种情况下,这将是您的最佳解决方案。 JFX中有一个关于遍历引擎策略替换的后门: 您可以继承内部类com.sun.javafx.scene.traversal.TraversalEngine 并使用 调用

  • 我对此完全陌生..... 问题是,当我切换到任何选项卡时,我无法获得正常的jpanel效果。按钮不能用鼠标点击(可以通过按tab键选择按钮n然后按space键点击),文本字段不能在鼠标点击时选择(只能通过按tab键选择)等。 那么对此有什么解决办法吗??我希望jtabbedpane中的面板像普通jpanel一样工作:)谢谢:)

  • 看看这款简单的app: 在文本字段上按Ctrl+Space键,listView将以焦点出现,您可以用箭头键进行选择。但是如果您将鼠标移动到listView上,customMenuItem将获得悬停高亮显示和listView松散焦点,箭头键将不再起作用 我如何保持对listview的关注??

  • 我正在用Java编程一个聊天客户机,在那里我希望有一个单独的JDialog用于所有打开的聊天。所以我决定使用一个JTabbedPane,其中一个选项卡代表一个单独的聊天。 我在每个选项卡中都放了一个JPanel,它只包含一个用于消息历史记录的JTextPane和一个用户输入消息的JTextArea。 为了更好的可用性,我实现了一个特性,当 打开新的ChatTab 用户在chattab之间进行更改(

  • 在具有父子指针的通用树结构中,是否可以在不遍历完整树的情况下遍历叶节点?例如,从最左边的叶节点开始。想法是在深树上进行优化。

  • 主要内容:什么是遍历?,遍历 DOM什么是遍历? jQuery 遍历,意为"移动",用于根据其相对于其他元素的关系来"查找"(或选取)HTML 元素。以某项选择开始,并沿着这个选择移动,直到抵达您期望的元素为止。 下图展示了一个家族树。通过 jQuery 遍历,您能够从被选(当前的)元素开始,轻松地在家族树中向上移动(祖先),向下移动(子孙),水平移动(同胞)。这种移动被称为对 DOM 进行遍历。 图示解析: <div> 元素是 <