public class TableCellEditorSample
{
public static void main(String[] args)
{
JFrame frame = new JFrame();
DefaultTableModel defaultTableModel = new DefaultTableModel(new Object[][]{{"Line 1", new MyPanel("ABC", "ABC")}, {"Line 2", new MyPanel("DEF", "DEF")}}, new String[] {"Header", "Header"})
{
@Override
public Class<?> getColumnClass(int columnIndex)
{
if (columnIndex == 1)
{
return MyPanel.class;
}
return super.getColumnClass(columnIndex);
}
};
JTable table = new JTable(defaultTableModel);
table.getColumnModel().getColumn(0).setPreferredWidth(40);
table.getColumnModel().getColumn(1).setPreferredWidth(200);
table.doLayout();
MyTableCellEditorAndRenderer editorAndRenderer = new MyTableCellEditorAndRenderer();
table.setDefaultRenderer(MyPanel.class, editorAndRenderer);
table.setDefaultEditor(MyPanel.class, editorAndRenderer);
table.setRowHeight(25);
frame.add(table);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setVisible(true);
}
/**
* Editor und renderer fuer die Tabelle
*/
private static class MyTableCellEditorAndRenderer extends AbstractCellEditor implements TableCellEditor, TableCellRenderer
{
MyPanel panel;
public Object getCellEditorValue()
{
return panel;
}
public boolean isCellEditable(EventObject anEvent)
{
if (anEvent instanceof MouseEvent)
{
return ((MouseEvent)anEvent).getClickCount() >= 2;
}
return true;
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column)
{
panel = (MyPanel) value;
setColor(panel,table, isSelected);
return panel;
}
public boolean stopCellEditing()
{
panel.getLabel().setText(panel.getTextField().getText());
return super.stopCellEditing();
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column)
{
MyPanel panel = (MyPanel) value;
setColor(panel,table, isSelected);
return panel;
}
private void setColor(MyPanel panel, JTable table, boolean isSelected)
{
if (isSelected)
{
panel.setBackground(table.getSelectionBackground());
}
else
{
panel.setBackground(table.getBackground());
}
}
}
/**
* Panel zum Anzeigen und editieren.
*/
private static class MyPanel extends JPanel
{
JTextField textField;
JLabel label;
private MyPanel(String text, String text2)
{
setLayout(new BorderLayout());
setBorder(new EmptyBorder(3,3,3,3));
label = new JLabel(text);
textField = new JTextField(text2, 20);
add(label, BorderLayout.WEST);
add(textField, BorderLayout.CENTER);
add(new JButton(new AbstractAction("Klick") {
public void actionPerformed(ActionEvent e)
{
JOptionPane.showMessageDialog(null, "Test");
}
}), BorderLayout.EAST);
}
private JTextField getTextField()
{
return textField;
}
private JLabel getLabel()
{
return label;
}
}
}