000
14.07.2005, 20:19 Uhr
~copper
Gast
|
Hi ich habe ein Prog, welches den inhalt einer datenbank dynamisch in eine Tabelle schreibt. Weiterhin füge ich checkboxen und Comboboxen ein. Die Daten in der DB sind Gruppen zugeteilt und die Gruppen werden dementsprechend auch in dem JTable angezeigt. Was ich machen möchte ist:
Wenn die Checkbox der Gruppe 1 aktiviert wird sollen automatisch auch alle anderen Checkboxen in Zeilen die zu Gruppe 1 gehören aktiviert werden.
Dazu der Quellcode:
Code: |
//das TableModel class Model extends AbstractTableModel{ private Class[] classes; private db2 datenbank = new db2(); private int spalte= datenbank.getfeldanzahl(); private int zeile= datenbank.getzeihlenzahl(); private String[] spaltentitel = new String[spalte+2]; private Object[][] tabinhalt = new Object [zeile][spalte+2]; public Model(){ classes = new Class[spalte+2]; for(int z = 0;z<spalte;++z) { classes[z] = String.class; } classes[spalte] = Boolean.class; for(int j = 0;j<zeile;++j) { for(int i = 0;i<spalte;++i) { tabinhalt[j][i] = datenbank.getInhalt(i+1,j+1); } //alle Checkboxen díeser Spalte werden auf false gesetzt tabinhalt[j][spalte] = false; } } public boolean isCellEditable(int rowIndex, int columnIndex) { return rowIndex < zeile&& columnIndex <= spalte+1; } public void setValueAt(Object aValue, int rowIndex, int columnIndex) { Object value = (Object)aValue; tabinhalt[rowIndex][columnIndex] = value; fireTableCellUpdated(rowIndex, columnIndex); } public int getColumnCount(){ return spalte+2; } public int getRowCount(){ return zeile; } public String getColumnName(int column){ for(int i=0; i<= spalte-1; ++i) { spaltentitel[i] = datenbank.getSpaltenName(i+1); } //zusätzliche Spalten für die Elemente spaltentitel[spalte] = "Checkbox"; spaltentitel[spalte+1] = "ComboBox"; return spaltentitel[column]; } public Object getValueAt(int rowindex, int columnindex){ return tabinhalt[rowindex][columnindex]; } public Class getColumnClass(int columnindex){ return classes[columnindex]; } }
|
Nun die Tabelle mit dem Table Listener
Code: |
class DataTable implements TableModelListener{ private Model model = new Model(); private JTable testtable = new JTable(model,null); private JComboBox combo = new JComboBox(); private TableColumn col; public DataTable(){ testtable.getModel().addTableModelListener(this); col = testtable.getColumnModel().getColumn(model.getColumnCount()-1); Object[] comboinh = new Object[]{"h","x"}; col.setCellRenderer(new ComboRenderer(comboinh)); col.setCellEditor(new DefaultCellEditor(combo)); } public void tableChanged(TableModelEvent e) { Object quelle= e.getSource(); int y= e.getFirstRow(); int x= e.getColumn(); if(x== model.getColumnCount()-2)//falls eine Änderung der Checkboxen stattgefunden hat { Object gruppenwert1 = model.getValueAt(y, 1);//lies welcher wert bei der Gruppe gesetzt ist, spalte 1 ist die Gruppenspalte for(int i =0; i<= model.getRowCount()-1; ++i ){// die Zeilen werden runtergezählt Object wert = model.getValueAt(i, 1); //und geschaut welcher wert Gruppe in den einzelnen Zeilen hat if( wert.equals(gruppenwert1) ){ status.ta1.append("Gruppe " + wert + " gesetzt\n"); // die Gruppe soll angezeigt werden model.setValueAt(true, i, model.getColumnCount()-2);//die anderen Checkboxen sollen gesetzt werden } } } }
|
Das Problem ist, sobald ich einen Haken in einer Checkbox setze wird der Listener ausgeführt und ich bekomme eine Fehlermeldung: StackOverflowError!!!!!!! Ich denke mir es liegt daran das in der For Schleife setValueAt aufgerufen wird. Eine Checkbox in der selben Spalte wird gesetzt und dadurch der Listener erneut aufgerufen? ODER? Aber wie kann ich sonst einen wert setzen??
Ich habe schon probiert eine Methode in das TabellenModel einzubauen welche das extra zu setValueAt das Array tabelleninhalt ändert.Diese Methode habe ich anstatt setValueAt in dre For schleife aufgerufen. Diese Methode sieht so aus:
Code: |
public void wertsetzen(boolean aValue, int rowIndex, int columnIndex) { boolean value = (boolean)aValue; tabinhalt[rowIndex][columnIndex] = value; }
|
Das Problem dabei war das die Grafik der Tabelle nicht richtig aktualisiert wurde. Also wie kann ich einen Wert setzen??? |