Hallo,
ich habe in einer JTable eine JComboBox welche im Vorfeld mit einem Vektor von Objekten ("ComboBoxItem") befüllt wird. Diese Objekte haben zwei Eigenschaften "id" und "description". Angezeigt wird die Description, und an das Backend wird die ID kommuniziert. Nun war es bisher so, das mein Model der View dieses Objekt als Eigenschaft hatte. Das passt vom MVC-Ansatz her aber nicht, und das Model sollte nur "ID" als Eigenschaft haben.
Nun habe ich ein Problem mit dem CellRenderer. Es ist nun so, das auch mein TableModel in den Records der Tabelle nur die ID abspeichert. Der DefaultTableCellRenderer zeigt nun als JLabel einfach den Wert an, welcher getValueAt des Table-Modells zurück liefert.
Das ist in dem Falle der JComboBox nun aber nur eine ID, welche in die Description "umgewandelt" werden muss.
Wie mache ich das am besten? Aktuell habe ich folgenden Code:
Ich würde mir gerne den Hack "ersparen" die Auswahl der Combobox auch nochmal dem Renderer zu übergeben. Komme ich an die Liste auch irgendwie im Renderer ran?
Oder habe ich eine Chance im getTableCellRendererComponent auf die eigentliche JComboBox direkt zuzugreifen um die es geht?
ich habe in einer JTable eine JComboBox welche im Vorfeld mit einem Vektor von Objekten ("ComboBoxItem") befüllt wird. Diese Objekte haben zwei Eigenschaften "id" und "description". Angezeigt wird die Description, und an das Backend wird die ID kommuniziert. Nun war es bisher so, das mein Model der View dieses Objekt als Eigenschaft hatte. Das passt vom MVC-Ansatz her aber nicht, und das Model sollte nur "ID" als Eigenschaft haben.
Nun habe ich ein Problem mit dem CellRenderer. Es ist nun so, das auch mein TableModel in den Records der Tabelle nur die ID abspeichert. Der DefaultTableCellRenderer zeigt nun als JLabel einfach den Wert an, welcher getValueAt des Table-Modells zurück liefert.
Das ist in dem Falle der JComboBox nun aber nur eine ID, welche in die Description "umgewandelt" werden muss.
Wie mache ich das am besten? Aktuell habe ich folgenden Code:
Java:
private Vector<ComboBoxItem> typeComboItems = new Vector<ComboBoxItem>();
private JComboBox typeField;
[...]
typeComboItems = ComboBoxList.getComboType(sessionDTO);
typeField = new JComboBox(typeComboItems);
table.getColumnModel().getColumn(ListCapitalSourceTableModel.TYPE_INDEX)
.setCellEditor(new DefaultCellEditor(typeField));
table.getColumnModel().getColumn(ListCapitalSourceTableModel.TYPE_INDEX)
.setCellRenderer(new JComboBoxRenderer(typeComboItems));
[...]
private class JComboBoxRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
private static final long serialVersionUID = 4913840877117376023L;
private Vector<ComboBoxItem> comboBoxItems;
public JComboBoxRenderer(Vector<ComboBoxItem> comboBoxItems) {
super();
this.comboBoxItems = comboBoxItems;
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
setText(comboBoxItems.get(comboBoxItems.indexOf(new ComboBoxItem((long)value,null))).toString());
return this;
}
}
Ich würde mir gerne den Hack "ersparen" die Auswahl der Combobox auch nochmal dem Renderer zu übergeben. Komme ich an die Liste auch irgendwie im Renderer ran?
Oder habe ich eine Chance im getTableCellRendererComponent auf die eigentliche JComboBox direkt zuzugreifen um die es geht?