Hallo zusammen,
ich bekomme es ums Verrecken nicht hin, eine JCombobox in einer Tabellenspalte richtig zu implementieren.
Ich habe es zwar schon hin bekommen, jedoch verschwindet dann nach einer Änderung in der Combobox das JComboBox Object aus dem Modell und es steht nur der String drin der ausgewählt wurde. Ist das normal?!?
Also ich habs so implementiert:
Der Renderer:
Der Editor:
Ich dachte wenn ich alles auf die Instanz der Combobox in den jeweiligen Zellen des Modells beziehe, dann müsste es doch funktionieren?!?
Trotzdem bleibt die Combobox immer leer. Ich verstehe auch nicht wieso "value" manchmal überhaupt vom Typ String sein kann, da ich doch die Combobox nie in einen String wandle?
In einigen Beispielen im Internet wir immer diese Instanz "cb" der Combobox im Renderer verwendet. Aber wozu wenn man eigentlich auf der Instanz im Modell arbeitet?!?
Oder legt man die Instanz gar nicht in das Modell?
Hoffe jemand kann mir das mal erklären.
Mfg keinGuru
ich bekomme es ums Verrecken nicht hin, eine JCombobox in einer Tabellenspalte richtig zu implementieren.
Ich habe es zwar schon hin bekommen, jedoch verschwindet dann nach einer Änderung in der Combobox das JComboBox Object aus dem Modell und es steht nur der String drin der ausgewählt wurde. Ist das normal?!?
Also ich habs so implementiert:
Java:
String[] header = {"Datum","Buchungstext","Betrag","Zuweisen"};
model = new DefaultTableModel(header,0);
JTable tab = new JTable(model);
tab.setRowHeight(20);
SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy");
concatenated = Tools.concat(new String[]{" ","löschen"},Cathegories.getCathegories());
Iterator<OpenPoint> it = m.getPoints().iterator();
while(it.hasNext()){
OpenPoint open = (OpenPoint)it.next();
String newname = df.format(open.getDate());
Object[] data = {newname,open.getText(),formatString(open.getMoney()), new JComboBox(concatenated)};
model.addRow(data);
}
tab.getColumnModel().getColumn(3).setCellRenderer(new ComboBoxCellRenderer(new JComboBox(concatenated)));
tab.getColumnModel().getColumn(3).setCellEditor(new ComboBoxCellEditor(m,new JComboBox(concatenated),model));
// Set learned data as default if something is available
for(int i=0;i<model.getRowCount();i++){
String data = Cathegories.getLearnData((String)model.getValueAt(i, 0), (String)model.getValueAt(i, 1), (String)model.getValueAt(i, 2));
JComboBox cb = ((JComboBox)model.getValueAt(i, 3));
cb.setSelectedItem(data);
model.setValueAt(cb,i, 3);
}
Der Renderer:
Java:
public class ComboBoxCellRenderer extends JComboBox implements TableCellRenderer {
private JComboBox cb = null;
public ComboBoxCellRenderer(JComboBox jComboBox)
{
cb = jComboBox;
}
public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected, boolean hasFocus, int row, int column)
{
if(value instanceof JComboBox)
return (JComboBox)value;
else{
cb.setSelectedItem(value);
table.getModel().setValueAt(cb,row, 3);
return (JComboBox)table.getModel().getValueAt(row, 3);
}
}
}
Der Editor:
Java:
public class ComboBoxCellEditor extends DefaultCellEditor implements ItemListener
{
private JComboBox cb = null;
private Month m = null;
private DefaultTableModel model = null;
private int row = 0;
public ComboBoxCellEditor(Month month, JComboBox jComboBox, DefaultTableModel model){
super(jComboBox);
cb = jComboBox;
cb.addItemListener(this);
this.m = month;
this.model = model;
}
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int rowIndex, int colIndex )
{
row = rowIndex;
if(value instanceof JComboBox){
return (JComboBox) value;
}
else{
cb.setSelectedItem(value);
model.setValueAt(cb,row, 3);
return (JComboBox)model.getValueAt(row, 3);
}
}
@Override
public void itemStateChanged(ItemEvent arg0) {
cb = (JComboBox)model.getValueAt(row, 3);
cb.setSelectedIndex(((JComboBox)arg0.getSource()).getSelectedIndex());
model.setValueAt(cb,row, 3);
Cathegories.addLearnData((String)cb.getSelectedItem(), (String)model.getValueAt(row, 0),(String)model.getValueAt(row, 1),(String)model.getValueAt(row, 2));
}
}
Ich dachte wenn ich alles auf die Instanz der Combobox in den jeweiligen Zellen des Modells beziehe, dann müsste es doch funktionieren?!?
Trotzdem bleibt die Combobox immer leer. Ich verstehe auch nicht wieso "value" manchmal überhaupt vom Typ String sein kann, da ich doch die Combobox nie in einen String wandle?
In einigen Beispielen im Internet wir immer diese Instanz "cb" der Combobox im Renderer verwendet. Aber wozu wenn man eigentlich auf der Instanz im Modell arbeitet?!?
Oder legt man die Instanz gar nicht in das Modell?
Hoffe jemand kann mir das mal erklären.
Mfg keinGuru