Hallo, etwas spezielle Frage. Bietet das TableModel eine Methode zum Überschreiben an, um den entsprechenden RowSorter zurückzugeben?
Zurzeit habe ich so etwas, und setze die RowSorter dann auf der JTable, was mir aber unsinnig erscheint, bzw. komplizierter als vielleicht nötig:
public static class MyTableModel extends AbstractTableModel {
private final String[] columnNames = {
"CONTAINER ID",
"NAME",
"CPU %",
"MEM USAGE",
"LIMIT",
"MEM %",
"NET I",
"NET O",
"BLOCK I",
"BLOCK O",
"PIDS",
"RUNS"
};
private final ArrayList<ArrayList<Object>> data = new ArrayList<>();
public void update() {
data.clear();
String[] tableArray = getTableArray();
for (String line : tableArray) {
addRow(line);
}
fireTableDataChanged();
}
private void addRow(String line) {
if (line.startsWith("CONTAINER ID")) {
return;
}
String[] rowData = line.split("\\s{2,}");
String[] temp1 = rowData[3].split(" / ");
String[] temp2 = rowData[5].split(" / ");
String[] temp3 = rowData[6].split(" / ");
ArrayList<Object> row = new ArrayList<>();
row.add(rowData[0]);
row.add(rowData[1]);
row.add(rowData[2]);
row.add(temp1[0]);
row.add(temp1[1]);
row.add(rowData[4]);
row.add(temp2[0]);
row.add(temp2[1]);
row.add(temp3[0]);
row.add(temp3[1]);
row.add(rowData[7]);
row.add("0".equals(rowData[7]) ? "No" : "Yes");
data.add(row);
}
@Override
public int getRowCount() {
return data.size();
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int column) {
return columnNames[column];
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return data.get(rowIndex).get(columnIndex);
}
public TableRowSorter<MyTableModel> getSorter() {
TableRowSorter<MyTableModel> sorter = new TableRowSorter<>(this);
TreeMap<String, Long> map =
new TreeMap<>(
(s1, s2) -> {
int l1 = s1.length();
int l2 = s2.length();
if (l1 != l2) {
return Integer.compare(l2, l1);
}
return s1.compareTo(s2);
});
map.put("%", 1L);
map.put("B", 1L);
map.put("KiB", 1024L);
map.put("MiB", 1024L * 1024L);
map.put("GiB", 1024L * 1024L * 1024L);
map.put("kB", 1000L);
map.put("MB", 1000L * 1000L);
map.put("GB", 1000L * 1000L * 1000L);
Comparator<String> comparator =
(o1, o2) -> {
Double d1 = null;
for (Map.Entry<String, Long> entry : map.entrySet()) {
if (o1.endsWith(entry.getKey())) {
d1 =
Double.parseDouble(o1.substring(0, o1.length() - entry.getKey().length()))
* entry.getValue();
break;
}
}
Double d2 = null;
for (Map.Entry<String, Long> entry : map.entrySet()) {
if (o2.endsWith(entry.getKey())) {
d2 =
Double.parseDouble(o2.substring(0, o2.length() - entry.getKey().length()))
* entry.getValue();
break;
}
}
if (d1 == null || d2 == null) {
return o1.compareTo(o2);
}
return Double.compare(d1, d2);
};
for (int i = 0; i < columnNames.length; i++) {
sorter.setComparator(i, comparator);
}
return sorter;
}
}
MyTableModel model = new MyTableModel();
JTable table = new JTable(model);
table.setRowSorter(model.getSorter());
Ich verstehe nicht, weshalb die RowSorter wohl in der JTable gespeichert werden.