有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在编辑jtable单元格时检测按下enter键?

我在jtable上有一个keylistener,这样当有人按下enter键时,就会进行一些计算。但是,只有当用户未进行编辑时,才会发生这种情况。当一个人完成编辑单元格并按enter键完成并关闭编辑时,我想应用此操作

我搞不懂,有人做过或者知道怎么做吗

基本上,现在要做的动作,人们必须按两次enter键,一次结束编辑,另一次我想做的动作,我想在编辑时只需要按一次

谢谢!


共 (3) 个答案

  1. # 1 楼答案

    I have a keylistener on jtable so that when someone presses enter some calculations happen. However, this only happens if the person is not editing. I would like to apply this action when a person finishes editing a cell and is pressing enter to finish and close the editing.

    • TableCellEditor没有将KeyListener添加到JTable中

    Basically, now for the action to be done, people must press enter twice, one to end the editing and another for the action that I want to happen, I would like to make it needed only once, while editing.

    • JComponents(用作TableCellEditor)默认情况下对按下ENTER键做出反应

    • 不要将JComponent放入TableModel,应该只存储TableCellRenderer绘制的值和TableCellEditor的初始值

    • TableCellEditor暂时是JComponent,如果用作TableCellEditor的JComponents对按下ENTER键没有反应,则必须添加KeyBindings来调用StopCellEdit


  2. # 2 楼答案

    您可以自定义自己的编辑器。使用DefaultCellEditor而不是使用KeyListener,应该使用KeyBindings

    看看这个例子

                JTable table = new JTable(myModel);
                JTextField cell = new JTextField();
                final TableCellEditor cellEditor = new DefaultCellEditor(cell);
                table.getColumnModel().getColumn(column).setCellEditor(cellEditor);
                InputMap iMap = cell.getInputMap(JComponent.WHEN_FOCUSED);
                iMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0),    KeyEvent.getKeyText(KeyEvent.VK_ENTER));
                ActionMap aMap = cell.getActionMap();
                aMap.put(KeyEvent.getKeyText(KeyEvent.VK_ENTER), new AbstractAction() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        if(callSomeOperationsIsOk()){
                          cellEditor.stopCellEditing();
                        }else{
                          cellEditor.cancelCellEditing();
                        }
                    }
                });
        }
    

    阅读教程How to use Tables中的更多内容,也许你会遇到与我之前看到的question相同的问题

  3. # 3 楼答案

    您可以重写JTable.editingStopped,编辑完成后会调用它,并在该方法中应用您的操作

    编辑:

    JTable.editingStopped不是为应用程序扩展而设计的。为了避免复杂性,尤其是平台依赖性复杂性,更好的方法是重写模型的setValueAt或注册TableModelListener。下面是一个例子:

    import javax.swing.*;
    import javax.swing.event.TableModelEvent;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.DefaultTableModel;
    
    public class DemoTable3 {
        private static void createAndShowUI() {
            JFrame frame = new JFrame("DemoTable");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            Object[][] rows = { { "Column 1", "Column 2" },
                    { "Column 1", "Column 2" } };
            Object[] columns = { "Column 1", "Column 2" };
    
            DefaultTableModel model = new DefaultTableModel(rows, columns);
            model.addTableModelListener(new TableModelListener() {
                @Override
                public void tableChanged(TableModelEvent e) {
                    System.out.println("apply additional action");
                }
            });
    
            JTable table = new JTable(model);
            frame.add(new JScrollPane(table));
            frame.setLocationByPlatform(true);
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String args[]) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowUI();
                }
            });
        }
    }
    

    另一种选择是添加CellEditorListener以捕获编辑的事件。例如:

    import javax.swing.*;
    import javax.swing.event.CellEditorListener;
    import javax.swing.event.ChangeEvent;
    import javax.swing.table.DefaultTableModel;
    
    public class DemoTable2 {
    
        private static void createAndShowUI() {
            JFrame frame = new JFrame("DemoTable");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            Object[][] rows = { { "Column 1", "Column 2" },
                    { "Column 1", "Column 2" } };
            Object[] columns = { "Column 1", "Column 2" };
    
            final JTable table = new JTable(new DefaultTableModel(rows, columns));
    
            table.getDefaultEditor(String.class).addCellEditorListener(
                    new CellEditorListener() {
                        public void editingCanceled(ChangeEvent e) {
                            System.out.println("editingCanceled");
                        }
    
                        public void editingStopped(ChangeEvent e) {
                            System.out.println("editingStopped: apply additional action");
                        }
                    });
    
            frame.add(new JScrollPane(table));
            frame.setLocationByPlatform(true);
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String args[]) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowUI();
                }
            });
        }
    }
    

    还可以看看@camickr的Table Cell Listener,它提供了编辑的自定义处理