Gibt es eine Möglichkeit, es zu tun?Wie kann ich Zeile in JTable ausblenden (unsichtbar machen)?
Antwort
Die beste einfachste Weg wäre, das entsprechende Element aus dem Modell zu entfernen.
Schauen Sie sich Sun's Tutorial for JTables an und sehen Sie sich den Sortier- und Filterbereich an.
Ich bin falsch oder Filterung wurde nur in Java 1.6 aktiviert? – joycollector
Ja, ich habe Angst. – willcodejavaforfood
JXTable von Swinglabs, wenn Sie versuchen möchten, in <1.6 zu filtern. Sie können auch ein eigenes TableModel erstellen, das ein anderes TableModel mit Sortierfunktionen darstellt. – KitsuneYMG
Es gibt die Klasse RowFilter<DefaultTableModel, Object>
, mit der Sie Zeilen ausfiltern können. Das DefaultTableModel kann durch ein eigenes Modell ersetzt werden. Um Filter, implementieren die Methode
@Override
public boolean include(Entry entry) {
// All rows are included if no filter is set
if (filterText.isEmpty())
return true;
// If any of the column values contains the filter text,
// the row can be shown
for (int i = 0; i < entry.getValueCount(); i++) {
String value = entry.getStringValue(i);
if (value.toLowerCase().indexOf(filterText) != -1)
return true;
}
return false;
}
Wenn Zeilen zugreifen, zum Beispiel auf ListSelectionEvents hören, vergessen Sie nicht den sichtbaren Zeilenindex zur vollständigen Zeilenindex in Ihrem Modell zu übersetzen. Java bietet eine Funktion für diese auch:
public void valueChanged(ListSelectionEvent e) {
ListSelectionModel lsm = (ListSelectionModel) e.getSource();
int visibleRowIndex = ... // Get the index of the selected row
// Convert from the selection index based on the visible items to the
// internal index for all elements.
int internalRowIndex = tableTexts
.convertRowIndexToModel(visibleRowIndex);
...
}
TY. Aber ich suchte nach einer Lösung für Java 1.5 ... – joycollector
Dies sollte die akzeptierte Antwort sein –
Sie können Arraylisten für jede Spalte einrichten, die für von Werten ausgefüllt werden gefiltert und diese in einem benutzerdefinierten Renderer implementieren. Wenn die Zeilenwerte einer Zelle nicht vollständig erfüllt sind, ruft der Renderer rekursiv sich selbst mit der Zeile + 1 auf.
, wenn die Zellen Reihe Kriterien nicht erfüllt, es gerendert wird, eine andere Arraylist speichert die Zeilennummern bereits gemacht, seine besten durch Beispiel erläutert dieses Verfahren ist in der Kunden Renderer erweitert JLabel
public Component getTableCellRendererComponent(JTable table, Object color,
boolean isSelected, boolean hasFocus, int row, int column) {
Object value;
String s;
try {
if (row == 0) {
drawn[column].clear();
}// drawn is arraylist which stores cols rend
if (row > table.getModel().getDataVector.size()) {
return null;
}// if we go too far
if (drawn[column].contains(Integer.toString(row)) == true) {
// already rendered?
return getTableCellRendererComponent(table, color, isSelected,
hasFocus, (row + 1), column);
}// render row+1
for (int i = 0; i < filters.length; i++) {
value = table.getModel().getValueAt(row, i);
s = (i == 1) ? df.format(value) : value.toString();
if (filters[i].contains(s) != true) {
//try and put in next row, if succeeds when it reaches column 8 it adds row to
return getTableCellRendererComponent(table, color,
isSelected, hasFocus, (row + 1), column);
}
}
value = table.getModel().getValueAt(row, column);
setFont(getFont().deriveFont(Font.BOLD));
if ((isSelected == false)) {
if ((column == 1)) {
setForeground(Color.magenta);
}// just formatting
else {
setForeground(Color.black);
setBackground(Color.white);
}
} else {
setBackground(Color.blue);
setForeground(Color.white);
}
if ((column == 1))// col 1 is a date, other columns strings
{
setText((value == null) ? "" : df.format(value));
} else {
setText((value == null) ? "" : value.toString());
}
todayStr = df.format(new java.util.Date());
dateval = table.getModel().getValueAt(row, 1);
String datevalStr = df.format(dateval);
if (datevalStr.equals(todayStr)) {
setForeground(Color.red);
}
drawn[column].add(Integer.toString(row));// mark row as rendered
} catch (Exception e) {
e.getMessage();
return null;
}
return this;
}
Aber wenn ich brauche, um zu zeigen, ihm später wieder? – joycollector
Dann fügen Sie es wieder :) – willcodejavaforfood
Endlich habe ich diesen Weg ... Zwei dataSets ... Einer ist voll, der andere füllt, wenn fireDataTableChanged aufgerufen ... Aber ich fürchte, es ist langsam ... – joycollector