2010-12-20 4 views
7

मैं एक संपादन योग्य JTable है और तरह तो एक DefaultCellEditor निर्धारित किया है:रद्द करना क्यों रद्द कर रहा है (JTable सेल संपादित करते समय भागने दबाते समय CellEditing() को कॉल नहीं किया जाता है?

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

हालांकि, जब भागने दबाने इस स्तंभ में एक सेल संपादित करते समय, हालांकि संपादन मोड समाप्त हो गया है, इस विधि कहा जाता है नहीं है। कोई विचार क्यों? क्या मुझसे कुछ गलत हो रही है? क्या इसे संभालने का कोई तरीका है (मैन्युअल रूप से एक KeyListener जोड़ने के अलावा)?

उत्तर

10

आधिकारिक रास्ता: AbstractCellEditor.addCellEditorListener (...): आप एक CellEditorListener रजिस्टर कर सकते हैं। अगर संपादन रद्द कर दिया गया है, तो संपादन रद्द (चेंजवेन्ट ई) को कॉल किया जाना चाहिए। एक रवि बगhttp://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6788481 के कारण, editingCanceled कहा जाता है नहीं :(

के रूप में आप अपने आप को वैकल्पिक हल के एस्केप कुंजी के लिए अपनी खुद की कार्रवाई रजिस्टर और इसे संभाल कर सकते हैं। लेकिन यह आकार बदलने की घटनाओं के लिए काम नहीं करेगा।

एक और समाधान (त्वरित और गंदा ;-)): मेथोड JTable.removeEditor() को ओवरराइट करें और सुपर कॉल के बाद अपना कोड डालें।

+0

अच्छी तरह से है कि बेकार है। धन्यवाद। – Epaga

0

मैं भी इस समस्या थी। मैंने एक और कामकाज लिखा जिसमें एक्शनलिस्टर और फोकस लिस्टर शामिल थे। यह है:

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 आप थोड़ा और पूरा समाधान पा सकते हैं।

0

एक और तरीका है ठीक इस बग:

jTable.addPropertyChangeListener("tableCellEditor", e -> { 
    Object o = e.getOldValue(); 
    if (o instanceof DefaultCellEditor) { 
     ((DefaultCellEditor) o).cancelCellEditing(); 
    } 
}); 
संबंधित मुद्दे