Wie kann ich eine Zeile in einer JTable ausblenden (nicht entfernen)?

0
10702

Der einfachste Weg, dies zu tun, besteht darin, ein Dekorator-/Filtermodell für Ihr Tabellenmodell zu implementieren.

Der Dekorateur würde TableModel implementieren, aber die an getValueAt(row,col) übergebenen Parameter basierend darauf anpassen, welche Zeilen Sie ausblenden möchten.

Zum Beispiel


öffentliche Klasse RowFilterModel implementiert TableModel { ... private boolean[] isRowHidden; private int numVisibleRows; public RowFilterModel(TableModel realModel) { this.realModel = realModel; numVisibleRows = realModel.getRowCount(); isRowHidden = new boolean[numVisibleRows]; } public int getRowCount() { return numVisibleRows; } public int getColumnCount() { return realModel.getColumnCount(); } public void setRowVisible(int row, boolean state) { isRowHidden[row] = !state; if (state) numVisibleRows++; sonst numVisibleRows--; } public Object getValueAt(int row, int col) { // nicht ausgeblendete Zeile zurückgeben // Es gibt wahrscheinlich effizientere Möglichkeiten, dies zu tun ... for(int realRow=0; true; realRow++) { if (! isRowHidden[realRow]) { if (row==0) { return realModel.getValueAt(count,col); } Reihe--; } } } }

Es gibt natürlich noch mehr zu tun, damit dies funktioniert (und der obige Code könnte ein paar Probleme enthalten), aber dies sollte die Grundidee vermitteln. Insbesondere müssen Sie die Ereignisbehandlung für das obige Tabellenmodell einrichten, um ordnungsgemäß zu melden, wenn sich die realTable ändert. Sie müssen auch auf Änderungen im realen Modell achten und das ausgeblendete Zeilenarray anpassen, wenn sich die reale Tabelle ändert.

Sie könnten dies dann wie folgt verwenden:


JTable t = ...; RowFilterModel filter = new RowFilterModel(t.getModel()); t.setModel(filter); ... filter.setRowVisible(42, true);

Beachten Sie, dass ich die darin enthaltene Logik umgekehrt habe, um „isRowHidden“ zu verwenden – dies macht sich die Tatsache zunutze, dass beim Erstellen des Arrays seine Werte falsch sind, sodass standardmäßig alle Zeilen sichtbar sind. Wenn wir es „isRowVisible“ genannt hätten, hätten wir alle Elemente des Arrays durchgehen und auf „true“ setzen müssen.

Ich empfehle Ihnen, meinen Artikel „Advanced Model-View-Controller Techniques“ auf der VisualAge Developer Domain von IBM zu lesen, um weitere Informationen zum hier verwendeten Modellfilterkonzept zu erhalten. Siehe http://www7.software.ibm.com/vad.nsf/Data/Document2329.