【问题标题】:how to control focus in JTable如何在 JTable 中控制焦点
【发布时间】:2010-09-30 05:26:20
【问题描述】:

我想要做的是当用户完成表格单元格中的数据编辑时,根据用户输入的内容将焦点移到另一个单元格上,并将该单元格转换为编辑模式,以便用户可以立即开始输入而无需执行其他操作。这样,用户可以专注于他的工作,软件将“思考”接下来应该编辑哪个单元格。

在现实生活中看起来并不那么简单的简单任务......有人知道吗?

【问题讨论】:

    标签: java user-interface swing focus jtable


    【解决方案1】:

    请试试这个例子。

    它应该让您通过输入值 u、d、l、r 来浏览表格,分别代表上、下、左、右。

    希望这能让您了解如何做。

    import java.awt.event.ActionEvent;
    
    import javax.swing.AbstractAction;
    import javax.swing.Action;
    import javax.swing.JFrame;
    import javax.swing.JTable;
    import javax.swing.KeyStroke;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableModel;
    
    public class Test extends JFrame {
    
        private JTable table;
        private TableModel tableModel;
    
        public Test() {
            tableModel = new DefaultTableModel(5, 5);
    
            table = new JTable(tableModel);
            table.setColumnSelectionAllowed(true);
    
            getContentPane().add(table);
    
            Action handleEnter = new AbstractAction() {
                public void actionPerformed(ActionEvent e) {
                    table.getCellEditor().stopCellEditing(); // store user input
                    int row = table.getSelectedRow();
                    int col = table.getSelectedColumn();
                    String val = String.valueOf(table.getValueAt(row, col)).toLowerCase();
                    if (val.equals("u"))
                        --row;
                    else if (val.equals("d"))
                        ++row;
                    else if (val.equals("l"))
                        --col;
                    else if (val.equals("r"))
                        ++col;
                    if (     row >= 0 && row < tableModel.getRowCount()
                          && col >= 0 && col < tableModel.getColumnCount()) {
                        table.changeSelection(row, col, false, false);
                        table.editCellAt(row, col);
                    }
                }
            };
            // replace action for ENTER, since next row would be selected automatically
            table.getInputMap().put(KeyStroke.getKeyStroke("ENTER"), "handleEnter");
            table.getActionMap().put("handleEnter", handleEnter);
        }
    
        public static void main(String[] args) {
            Test test = new Test();
            test.setSize(800, 600);
            test.setVisible(true);
        }
    }
    

    【讨论】:

      【解决方案2】:

      您应该向 JTable 添加一个 KeyListener 以获取所有键入的字符。 用户按下 Enter 后,您应该检查用户输入的单词。

      编写自己的FocusTraversalPolicy 将其设置为表格

      table.setFocusTraversalPolicy(policy)
      

      FocusTraversalPolicy 描述了哪个组件获得下一个焦点。 在此之后您可以调用

      FocusManager.getCurrentManager().focusNextComponent();
      

      编辑:我没有对此进行测试,这只是一个想法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-11
        • 1970-01-01
        • 1970-01-01
        • 2011-11-20
        • 1970-01-01
        • 1970-01-01
        • 2011-01-06
        相关资源
        最近更新 更多