Hallo zusammen,
ich habe eine JTable. Zeilen werden grün eingefärbt, wenn DataManager.doesRowMatch(row) wahr ist und rot, wenn DataManager.doesRowMatch(row) unwahr ist.
Ich wünsche mir einen RowSorter, der die Daten sortiert, aber die grünen Zeilen immer oben vor den roten Zeilen anzeigt, unabhängig von den Zellwerten.
Hier ist mein Quelltext:
Vielen Dank für eure Hilfe!
ich habe eine JTable. Zeilen werden grün eingefärbt, wenn DataManager.doesRowMatch(row) wahr ist und rot, wenn DataManager.doesRowMatch(row) unwahr ist.
Ich wünsche mir einen RowSorter, der die Daten sortiert, aber die grünen Zeilen immer oben vor den roten Zeilen anzeigt, unabhängig von den Zellwerten.
Hier ist mein Quelltext:
Java:
import java.awt.*;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Random;
import javax.swing.*;
import javax.swing.table.*;
public class MainFrame{
JFrame frame;
static int columnCount = 5;
static int rowCount = 10;
JTable table;
DefaultTableModel model;
public MainFrame() {
frame = new JFrame();
frame.setSize(600, 600);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
setupTable();
frame.add(new JScrollPane(table));
frame.setVisible(true);
}
public static void main(String[] args) {
new MainFrame();
}
private void setupTable() {
table = new JTable();
model = new DefaultTableModel();
table.setModel(model);
model.setRowCount(rowCount);
model.setColumnCount(columnCount);
table.setDefaultRenderer(Object.class, new MyRenderer());
table.setRowHeight(30);
Random r = new Random();
for(int i = 0; i < rowCount; i++) {
for(int j = 1; j < columnCount; j++) {
model.setValueAt(r.nextInt(90) + 10, i, j);
}
model.setValueAt(i, i, 0); //Erste Spalte bekommt keine Zufallszahlen,
//sondern Zeilennummern
}
TableRowSorter<DefaultTableModel> sorter = new MySorter(model);
table.setRowSorter(sorter);
Comparator<Integer> matchingRowComparator = new Comparator<Integer>() {
@Override public int compare(Integer x1, Integer x2){
boolean b1 = DataManager.doesRowMatch(x1);
boolean b2 = DataManager.doesRowMatch(x2);
System.out.println(x1 + "," + b1);
if(b1 == b2) return 0;
else if(b1) return -1;
else return 1;
}
};
sorter.setComparator(0, matchingRowComparator);
//nuberComparator wird im Moment nicht verwendet,
//ich würde aber gerne die erste Spalte danach sortieren
Comparator<Integer> numberComparator = new Comparator<Integer>() {
@Override public int compare(Integer x1, Integer x2){
return x1 - x2;
}
};
}
}
class DataManager{
private static boolean[] matchingRows = new boolean[] {
true, false, true, true, false, true, false, false, true, false // nur ein Beispiel
};
public static boolean doesRowMatch(int row) {
return matchingRows[row];
}
}
class MyRenderer implements TableCellRenderer{
private static final Color MATCHING_COLOR = new Color(140, 255, 140);//green
private static final Color NOT_MATCHING_COLOR = new Color(255, 140, 140);//red
@Override public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int volumn){
JPanel p = new JPanel();System.out.println(value);
JLabel l = new JLabel(String.valueOf(value));
p.add(l);
if(DataManager.doesRowMatch(table.getRowSorter().convertRowIndexToModel(row))) {
l.setBackground(MATCHING_COLOR);
p.setBackground(MATCHING_COLOR);
}else {
l.setBackground(NOT_MATCHING_COLOR);
p.setBackground(NOT_MATCHING_COLOR);
}
return p;
}
}
class MySorter extends TableRowSorter<DefaultTableModel>{
public MySorter(DefaultTableModel m) {
super(m);
}
@Override public void toggleSortOrder(int column) {
super.toggleSortOrder(column);
/*
mein 1. Versuch funktioniert nicht:
java.util.List<?> l = (java.util.List<?>)getSortKeys();
ArrayList<SortKey> sortKeys = new ArrayList<SortKey>();
int listSize = l.size();
for(int i = 0; i < listSize; i++) {
sortKeys.add(new SortKey(0, SortOrder.ASCENDING));
}
setSortKeys(sortKeys);
sort();
*/
/*
Mein 2. Versuch:
Auf diese Art kann man die erste Spalte gar nicht sortieren,
die anderen nur aufsteigend
super.toggleSortOrder(0);
*/
}
}
Vielen Dank für eure Hilfe!