2012-05-03 2 views
0

MyTableCellEditor необходимо добавить в JTable редактирование перезаписи (например, ячейку Excel) и правила ввода данных (parseDouble). Почему ячейка стирает введенное пользователем значение, когда пользователь нажимает на другую ячейку? IOW: значение, которое вводится в ячейку, отображается до тех пор, пока не будет нажата другая ячейка, после чего она исчезнет. Выполнение программы getTableCellEditorComponent вызывается, когда значение ячейки редактируется пользователем, а getCellEditorValue вызывается, когда редактирование ячейки завершено.Почему JTable не показывает ввод пользователя?

public class MyTableFrame extends javax.swing.JFrame 
    implements TableModelListener { 
    private static TableColumn column2; 

    public MyTableFrame() { 
     initComponents(); 
     ... 
     column2 = jTable.getColumnModel().getColumn(2); 
     column2.setCellEditor(new MyTableCellEditor()); 
     jTable.getModel().addTableModelListener(this); 
    } 
} 

public class MyTableCellEditor extends AbstractCellEditor implements 
     TableCellEditor { 

    // Component to handle the editing of a cell value 
    private JTextField component = new JTextField(); 
    // Return value 
    private Object value; 
    private DefaultTableModel model; 
    private int rowIndex; 
    private int columnIndex; 

    public Component getTableCellEditorComponent(JTable table, Object value, 
      boolean isSelected, int rowIndex, int columnIndex) { 
     model = (DefaultTableModel) table.getModel(); 
     this.value = value; 
     this.rowIndex = rowIndex; 
     this.columnIndex = columnIndex; 
     component.setText(""); 
     return component; 
    } 

    public Object getCellEditorValue() { 
     try { 
      return Double.parseDouble(model.getValueAt(rowIndex, columnIndex) 
       .toString()); 
     } catch (Exception ex) { 
      return value; 
     } 
    } 
} 

ответ

1

Я полагаю, что запись была внесена в модель после завершения редактирования. Поэтому получение значения из модели в getCellEditorValue() даст вам значение перед редактированием.

Вместо этого вы должны использовать component.getText() для получения значения.

return Double.parseDouble(component.getText()) 
+0

Точно так. Бесконечно благодарен. – jacknad

Смежные вопросы