Hallo,
Ich habe folgendes Problem:
Ich habe eine JTable mit verschiedenen Objekten in den einzelnen Spalten. Nun möchte ich für eine eigene Klasse Record den CellRenderer und den CellEditor anpassen damit in der Zelle eine JCheckBox ist, deren Wert die Variable 'recordable' repräsentiert.
Die Klasse Record (vereinfacht):
In der Klasse wo ich die JTable kreiere, setze ich die Renderer und Editoren für die Klasse Record:
Der Editor sieht folgendermassen aus:
Und so der Renderer:
Den Effekt den ich habe ist Folgender. Wenn ich die Zelle anklicke erscheint die Checkbox und wechselt ihren Status (checked, unchecked). Sobald ich aber die Zelle wieder verlasse (Anderen Button wählen oder andere Zelle) verschwindet die Checkbox sofort wieder.
Hat jemand eine Idee? Was mache ich falsch? Ich muss gestehen, dass ich durch die Editor/Renderer-Geschichte noch nicht ganz durchblicke und deshalb komme ich mit der Frage auch zu euch...
Vielen Dank für eure Hilfe! ???
Ich habe folgendes Problem:
Ich habe eine JTable mit verschiedenen Objekten in den einzelnen Spalten. Nun möchte ich für eine eigene Klasse Record den CellRenderer und den CellEditor anpassen damit in der Zelle eine JCheckBox ist, deren Wert die Variable 'recordable' repräsentiert.
Die Klasse Record (vereinfacht):
Code:
public class Record implements{
private boolean recordable;
private boolean recorded;
public Record(){
this.recordable = true;
this.recorded = true;
}
}
In der Klasse wo ich die JTable kreiere, setze ich die Renderer und Editoren für die Klasse Record:
Code:
table.setDefaultRenderer(Record.class, new RecordCellRenderer(true));
table.setDefaultEditor(Record.class, new RecordCellEditor());
Der Editor sieht folgendermassen aus:
Code:
public class RecordCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener {
Record currentRecord;
JCheckBox checkBox;
public RecordCellEditor() {
super();
checkBox = new JCheckBox();
checkBox.addActionListener(this);
checkBox.setBorderPainted(false);
}
public void actionPerformed(ActionEvent e) {
if(currentRecord.isRecordable()){
currentRecord.setRecordable(false);
checkBox.setSelected (false);
}
else{
currentRecord.setRecordable(true);
checkBox.setSelected (true);
}
}
public Object getCellEditorValue() {
return currentRecord;
}
public Component getTableCellEditorComponent(JTable table,
Object value,
boolean isSelected,
int row,
int column) {
currentRecord = (Record)value;
if(currentRecord.isRecordable()){
currentRecord.setRecordable(false);
checkBox.setSelected (false);
}
else{
currentRecord.setRecordable(true);
checkBox.setSelected (true);
}
return checkBox;
}
}
Und so der Renderer:
Code:
public class RecordCellRenderer extends JLabel implements TableCellRenderer {
Border unselectedBorder = null;
Border selectedBorder = null;
JCheckBox checkBox;
boolean isBordered = true;
public RecordCellRenderer(boolean isBordered) {
this.isBordered = isBordered;
setOpaque(true); //MUST do this for background to show up.
}
public Component getTableCellRendererComponent(JTable table, Object record, boolean isSelected, boolean hasFocus, int row, int column) {
Record newRecord = (Record)record;
checkBox = new JCheckBox();
checkBox.setSelected(newRecord.isRecordable());
add(checkBox);
return this;
}
}
Den Effekt den ich habe ist Folgender. Wenn ich die Zelle anklicke erscheint die Checkbox und wechselt ihren Status (checked, unchecked). Sobald ich aber die Zelle wieder verlasse (Anderen Button wählen oder andere Zelle) verschwindet die Checkbox sofort wieder.
Hat jemand eine Idee? Was mache ich falsch? Ich muss gestehen, dass ich durch die Editor/Renderer-Geschichte noch nicht ganz durchblicke und deshalb komme ich mit der Frage auch zu euch...
Vielen Dank für eure Hilfe! ???