Wie kann ich mich verstecken (unsichtbar machen) Zeile in JTable?
Frage
Gibt es eine Möglichkeit, es zu tun?
Lösung
Das bester einfachste Weg, um das entsprechende Element aus dem Modell zu entfernen wäre.
Andere Tipps
Es ist die RowFilter<DefaultTableModel, Object>
Klasse, die Sie herausfiltern Zeilen verwenden können. Die DefaultTableModel kann durch Ihr eigenes Modell ersetzt werden. So filtern, 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);
...
}
Schauen Sie sich Sun Tutorial für JTables und schauen am Sortieren und Filtern Abschnitt.
Sie könnten ein Arraylisten für jede Spalte einrichten, die für von Werten ausgefüllt werden gefiltert und diese in einem benutzerdefinierten Renderer implementieren. Wenn ein Zellen gesamte Zeilenwerte nicht der Renderer erfüllt sind rekursiv nennt sich mit der Zeile + 1.
, wenn die Zellen Reihe Kriterien nicht erfüllt, es gerendert wird, speichert eine andere Arraylist 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;
}