当前位置: 首页 > 面试题库 >

JTable在按键上编辑

魏书
2023-03-14
问题内容

我试图以编程方式开始JTable在按键上编辑当前行的第三列。

我实现了一个KeyListener,其中keyReleased()包含以下代码

if (e.getKeyCode() == KeyEvent.VK_ENTER)
{
    myTab.changeSelection(myTab.getSelectedRow(), 2, true, false);
    myTab.editCellAt(myTab.getSelectedRow(), 2);
}

当我释放Enter时,单元格确实是可编辑的(我可以在末尾键入),但是没有插入符号。

当我用鼠标单击时,行为是预期的(我可以进行编辑,并且存在carret)。

另外,我注意到在释放键时,我的celleditor为null,而在mouseclick上,它也不为null。

我究竟做错了什么?


问题答案:

避免使用KeyListener,它在关注焦点和调度事件的顺序方面是不可靠的(有可能在侦听器之前消耗了它们的密钥,因此永远不会收到通知)。

使用键绑定,而不是

InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
ActionMap am = table.getActionMap();

KeyStroke enterKey = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);

im.put(enterKey, "Action.enter");
am.put("Action.enter", new AbstractAction() {
    public void actionPerformed(ActionEvent evt) {
        table.changeSelection(table.getSelectedRow(), 2, false, false);
        if (!table.editCellAt(table.getSelectedRow(), 2)) {
            JOptionPane.showMessageDialog(table, "Failed to start cell editing");
        }
    }
});

我也对此myTab.changeSelection(myTab.getSelectedRow(), 2, true, false);电话表示怀疑。JavaDocs基本上说…

切换:true,扩展:false。如果选择了指定的单元格,请取消选择它。如果未选中,请选择它。

这提示我,如果当前选中该单元格,则将其取消选中。

更新了工作示例

public class TestTableEditor {

    public static void main(String[] args) {
        new TestTableEditor();
    }

    private JTable table;

    public TestTableEditor() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                table = new JTable(new MyTableModel());
                InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
                ActionMap am = table.getActionMap();

                KeyStroke enterKey = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);

                im.put(enterKey, "Action.enter");
                am.put("Action.enter", new AbstractAction() {
                    public void actionPerformed(ActionEvent evt) {
                        table.changeSelection(table.getSelectedRow(), 1, false, false);
                        if (!table.editCellAt(table.getSelectedRow(), 1)) {
                            JOptionPane.showMessageDialog(table, "Failed to start cell editing");
                        }
                    }
                });

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class MyTableModel extends AbstractTableModel {

        @Override
        public int getRowCount() {
            return 1;
        }

        @Override
        public int getColumnCount() {
            return 3;
        }

        @Override
        public Object getValueAt(int rowIndex, int columnIndex) {
            Object value = null;
            switch (columnIndex) {
                case 0:
                    value = "Can't edit";
                    break;
                case 1:
                    value = "Edit me";
                    break;
                case 2:
                    value = "Can't edit";
                    break;
            }
            return value;
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            return columnIndex == 1;
        }
    }
}

更新

在所有愚蠢,痛苦,难以找到的…

添加table.setSurrendersFocusOnKeystroke(true);到您的代码…

设置当由于单元格的JTable转发键盘事件而激活编辑器时,此JTable中的编辑器是否获得键盘焦点。默认情况下,此属性为false,除非单击该单元格,否则JTable保留焦点。



 类似资料:
  • 我编写了一个自定义的,这样当我键入示例的列时,除了数字之外什么都不能输入。 如果用户单击单元格一次,然后开始键入,同时仍然允许用户双击单元格开始编辑,我如何防止用户能够编辑单元格?

  • 问题内容: 我在项目中停留了2天,我无法实现如何使 ENTER KEY 像 TAB KEY一样工作 我尝试了 键侦听器, 但是ENTER KEY具有JTable的默认功能,因此它无法正常工作,而且它一直在下降。我在google上发现我需要使用 键绑定, 但是我无法实现它。 任何人都可以在JTable上给我完整的编码示例吗?请您帮忙。 提前致谢 问题答案: 基本的做法是使用键绑定API,该API在大

  • 在我的程序中,有一个带有许多加速器的JMenu和一个可编辑的JTable。问题是,当编辑JTable时,加速器键仍然会被触发。 编辑上表中的任何单元格,有一个菜单项设置为哔哔声与加速器'n'。

  • 设计定制JTable我已经知道DefaultCellEditor在其构造函数中允许使用JComboBox。单击此JComboBox以显示列表项时,它显示在JTable的其他单元格上方。问题是,我需要一个更复杂的行为,就像JComboBox提供的那样,这样我就用一个JList和一个JButton实现了一个JTextField,当点击JButton(或者用户在JTextField中输入文本)时,JLi

  • 问题内容: 我的目标是在编辑器上以VK-ENTER结尾的任何输入,它执行操作pindah(正在添加新行并设置光标在新行上闪烁)。抱歉,我无法从该示例中学习。 有办法吗? 这是我的代码(不包括导入,因为Eclipse会自动建议它): 问题答案: 不是答案,而是关于您代码的一些注释。 首先,您需要了解事件调度线程(EDT)。GUI组件的更新需要在EDT上完成。 通常,您不需要保留嵌套的SwingUti

  • 我在我的JTable中实现撤消/重做功能,但是我在JTable的默认行为上有一个问题,它会在任何键按下时开始编辑单元格。 当按下这两个键时,如何防止单元格编辑? 注意:我有多个面板,其中一个面板内有多个表,我尝试重写,但失败了。