[英]Out-of-table column sorting with Glazed Lists and a JXTable
我正在使用Glazed Lists排序和過濾JXTable。
如何對表外值排序? 也就是說,我希望能夠以自己的方式設置列值的格式,而對原始值進行排序。
我當前的相關代碼:
EventList<Foo> foos = GlazedLists.threadSafeList(new BasicEventList<Foo>());
foos.add(new Foo("bar", 5000000));
ObservableElementList.Connector<Foo> fooConnector = GlazedLists.beanConnector(Foo.class);
EventList<Foo> observedFoos = new ObservableElementList<Foo>(foos, fooConnector);
SortedList<Foo> sortedFoos = new SortedList<Foo>(observedFoos, null);
EventTableModel tableModel = new EventTableModel(sortedFoos, someTableFormat);
JXTable t = new JXTable(tableModel);
new TableComparatorChooser<Foo>(t, sortedFoos, false);
在此示例中,我想將第二列中的值格式化為5.0M
而不是5000000
,但是如果我在列表中使用此值,它將無法正確排序。
提前致謝。
也許您必須禁用JXTable排序,以便它不干擾GL排序? 就像是:
jxtable.setSortable(false);
jxtable.setAutoCreateRowSorter(false);
jxtable.setRowSorter(null);
...然后在表上安裝GlazedLists TableComparatorChooser,如下所示:
TableComparatorChooser.install(jxtable, sortedFoos, TableComparatorChooser.SINGLE_COLUMN);
還是您要在表中而不是在列表中將5000000格式化為5.0M? 然后,您只需實現TableFormat的
public Object getColumnValue(E yourObject, int column)
返回5000000的5.0M表示形式。
...很可能是我沒有完全理解問題,這些答案也無濟於事;-)
編輯:可運行的示例...
查看main方法中的代碼-尤其是帶有START-END注釋的代碼。 我做了一個非常簡單的例子,但您應該理解我的意思。
哦...很抱歉為類/變量/ ...的命名;-)
import ca.odell.glazedlists.BasicEventList;
import ca.odell.glazedlists.EventList;
import ca.odell.glazedlists.SortedList;
import ca.odell.glazedlists.gui.TableFormat;
import ca.odell.glazedlists.swing.EventTableModel;
import ca.odell.glazedlists.swing.TableComparatorChooser;
import java.util.Comparator;
import java.util.List;
import javax.swing.ComboBoxEditor;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import org.jdesktop.swingx.JXTable;
public class Tester {
private static class MyObject implements Comparable<MyObject> {
private final int number;
private final String value;
public MyObject(int number, String value) {
this.number = number;
this.value = value;
}
public int getNumber() {
return number;
}
public String getValue() {
return value;
}
@Override
public int compareTo(MyObject t) {
return value.compareTo(t.getValue());
}
}
private static class MyTableFormat implements TableFormat<MyObject> {
@Override
public int getColumnCount() {
return 2;
}
@Override
public String getColumnName(int i) {
switch (i) {
case 0:
return "FormattedNumber";
case 1:
return "String";
default:
throw new IllegalStateException();
}
}
@Override
public Object getColumnValue(MyObject e, int i) {
switch (i) {
case 0:
return getNumberString(e.getNumber());
case 1:
return e.getValue();
default:
throw new IllegalStateException();
}
}
private Object getNumberString(int number) {
switch (number) {
case 1:
return "One";
case 2:
return "Two";
case 3:
return "Three";
default:
throw new IllegalStateException();
}
}
}
private static class MyComparator implements Comparator<MyObject> {
@Override
public int compare(MyObject t, MyObject t1) {
return Integer.valueOf(t.getNumber()).compareTo(Integer.valueOf(t1.getNumber()));
}
}
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
EventList<MyObject> list = new BasicEventList<MyObject>();
list.add(new MyObject(1, "A"));
list.add(new MyObject(2, "B"));
list.add(new MyObject(3, "C"));
SortedList<MyObject> sortedList = new SortedList<MyObject>(list);
EventTableModel<MyObject> tableModel = new EventTableModel<MyObject>(sortedList, new MyTableFormat());
JXTable jxtable = new JXTable(tableModel);
/**
* START
* - Deactivate JXTables build-in sorting
* - Install GlazedLists sorting
* - Set the comparator for the "string number" column
*/
// deactivate sorting of JXTable
jxtable.setSortable(false);
jxtable.setAutoCreateRowSorter(false);
jxtable.setRowSorter(null);
// enable GlazedLists sorting
TableComparatorChooser<MyObject> tcc = TableComparatorChooser.install(jxtable, sortedList, TableComparatorChooser.SINGLE_COLUMN);
// set the comparator for your "string number" column
List<Comparator> comparators = tcc.getComparatorsForColumn(0);
comparators.clear();
comparators.add(new MyComparator());
/**
* END
*/
JFrame f = new JFrame("Tester");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new JScrollPane(jxtable));
f.pack();
f.setVisible(true);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.