package org.rr.commons.swing.components; import java.util.logging.Level; import javax.swing.CellEditor; import javax.swing.JTable; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.TableModel; import org.rr.commons.log.LoggerFactory; public class JRTable extends JTable { private boolean stopEditOnSelectionChange = false; private boolean editable = true; public JRTable() { getSelectionModel().addListSelectionListener(new StopEditListSelectionListener()); } /** * Stops the editing of the current table cell. * @return The editor that was stopped. <code>null</code> is returned if * the table isn't in edit mode. */ public synchronized CellEditor stopEdit() { try { if (isEditing()) { CellEditor editor = getCellEditor(editingRow, editingColumn); if (editor == null) { editor = getDefaultEditor(getColumnClass(editingColumn)); } editor.stopCellEditing(); removeEditor(); return editor; } } catch (Exception ex) { LoggerFactory.getLogger(this).log(Level.INFO, "stopEdit has failed.", ex); } return null; } @Override public void setModel(TableModel dataModel) { super.setModel(dataModel); //after setting the model sometimes the first renderer is rendered with the // wrong background color. A repaint fix these problem. SwingUtilities.invokeLater(new Runnable() { @Override public void run() { repaint(); } }); } public boolean isStopEditOnSelectionChange() { return stopEditOnSelectionChange; } /** * Stops the table edit if the table selection changes. */ public void setStopEditOnSelectionChange(boolean stopEditOnSelectionChange) { this.stopEditOnSelectionChange = stopEditOnSelectionChange; } private class StopEditListSelectionListener implements ListSelectionListener { @Override public void valueChanged(ListSelectionEvent e) { if(isStopEditOnSelectionChange()) { if(getSelectedRow() != getEditingRow()) { stopEdit(); } } } } @Override public void setSelectionModel(ListSelectionModel newModel) { super.setSelectionModel(newModel); newModel.addListSelectionListener(new StopEditListSelectionListener()); } /** * Specify if cells in the table should be editable or not. * @param editable <code>true</code> is the default behavior and <code>false</code> makes all * cells uneditable. * */ public void setEditable(boolean editable) { this.editable = editable; } @Override public boolean isCellEditable(int row, int column) { if(editable) { return super.isCellEditable(row, column); } return false; } }