有 Java 编程相关的问题?

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

java为什么在编辑JTable单元格时按escape键时不调用CancellEditing()?

我有一个可编辑的JTable,并设置了DefaultCellEditor,如下所示:

    colModel.getColumn( 1 ).setCellEditor( new DefaultCellEditor( txtEditBox ) {
        // ...
        @Override
        public void cancelCellEditing() {
            super.cancelCellEditing();
            // handling the event
        }
        // ...
    }

但是,在编辑此列中的单元格时按escape键时,尽管编辑模式已完成,但不会调用此方法。知道为什么吗?我做错什么了吗?有没有办法处理这个问题(除了手动添加一个按键监听器)


共 (2) 个答案

  1. # 1 楼答案

    我也有这个问题。我写了另一个涉及ActionListener和FocusListener的变通方法。就是这样:

    public class TableEditorListenerHelper {
    
    // dealing with events
    private final EventListenerList listeners = new EventListenerList();
    private ChangeEvent changeEvent;
    
    // cell editor that we're helping
    private CellEditor editor;
    
    // transient state
    private boolean editing = false;
    private JTable table;
    
    public TableEditorListenerHelper(CellEditor editor, JTextField field) {
        this.editor = editor;
        field.addActionListener(new ActionListener() {
            @Override public void actionPerformed(ActionEvent e) {
                fireEditingStopped();
            }
        });
        field.addFocusListener(new FocusListener() {
    
            @Override public void focusGained(FocusEvent e) {
                editing = true;
            }
    
            @Override public void focusLost(FocusEvent e) {
                JTable table = TableEditorListenerHelper.this.table;
                if (editing && isEditing(table)) {
                    fireEditingCanceled();
                }
            }
    
            private boolean isEditing(JTable table) { // a hack necessary to deal with focuslist vs table repaint
                return table != null && table.isEditing();
            }
    
        });
    }
    
    public void setTable(JTable table) {
        this.table = table;
    }
    
    public void addCellEditorListener(CellEditorListener l) {
        listeners.add(CellEditorListener.class, l);
    }
    
    public void removeCellEditorListener(CellEditorListener l) {
        listeners.remove(CellEditorListener.class, l);
    }
    
    public CellEditorListener[] getCellEditorListeners() {
        return listeners.getListeners(CellEditorListener.class);
    }
    
    protected void fireEditingCanceled() {
        for (CellEditorListener l : getCellEditorListeners()) {
            l.editingCanceled(getOrCreateEvent());
        }
        resetEditingState();
    }
    
    protected void fireEditingStopped() {
        for (CellEditorListener l : getCellEditorListeners()) {
            l.editingStopped(getOrCreateEvent());
        }
        resetEditingState();
    }
    
    private void resetEditingState() {
        table = null;
        editing = false;
    }
    
    private ChangeEvent getOrCreateEvent() {
        return changeEvent = changeEvent == null ? new ChangeEvent(editor) : changeEvent;
    }
    

    Here你可以找到一个更完整的解决方案

  2. # 2 楼答案

    官方方式:你可以注册一个CellEditorListener:AbstractCellEditor。addCellEditorListener(…)。如果编辑被取消,则应调用EditingCancelled(ChangeEvent e)由于太阳虫http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6788481编辑取消未被调用:(

    作为解决方法,您可以注册自己对退出密钥的操作,并自行处理。但它不适用于调整大小事件

    另一个解决方案(快速而肮脏;-):覆盖methode JTable。removeEditor()并在超级调用后插入代码