Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用釉面列表和JXTable进行表外列排序_Java_Sorting_Jtable_Glazedlists_Jxtable - Fatal编程技术网

Java 使用釉面列表和JXTable进行表外列排序

Java 使用釉面列表和JXTable进行表外列排序,java,sorting,jtable,glazedlists,jxtable,Java,Sorting,Jtable,Glazedlists,Jxtable,我正在使用釉面列表对JXTable进行排序和筛选 如何对表外值进行排序?也就是说,我希望能够以自己的方式格式化列值,同时对原始值进行排序 我目前的相关代码: EventList<Foo> foos = GlazedLists.threadSafeList(new BasicEventList<Foo>()); foos.add(new Foo("bar", 5000000)); ObservableElementList.Connector<Foo> foo

我正在使用釉面列表对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);
EventList foos=glazedlist.threadSafeList(新的BasicEventList());
添加(新的Foo(“bar”,5000000));
ObservableElementList.Connector fooConnector=glazedList.BeanConconnector(Foo.class);
EventList observedFoos=新的ObservableElementList(foos,fooConnector);
SortedList sortedFoos=新的SortedList(观察到的Foos,空);
EventTableModel tableModel=新的EventTableModel(sortedFoos,someTableFormat);
JXTable t=新的JXTable(tableModel);
新的表格比较选择器(t,已分类的OOS,false);
在本例中,我希望将第二列中的值设置为
5.0M
,而不是
5000000
,但如果在列表中使用此值,它将无法正确排序


提前感谢。

也许您必须禁用JXTable排序,这样它才不会干扰GL排序?比如:

jxtable.setSortable(false);
jxtable.setAutoCreateRowSorter(false);
jxtable.setRowSorter(null);
。。。然后在表上安装GlazedList TableComparatorChooser,如:

TableComparatorChooser.install(jxtable, sortedFoos, TableComparatorChooser.SINGLE_COLUMN);
或者,您的意思是,您想在表中将5000000格式化为5.0M,而不是在列表中?那么您只需要实现TableFormat的

public Object getColumnValue(E yourObject, int column)
返回5000000的5.0M表示

。。。很可能是因为我没有完全理解这个问题,而这些答案没有帮助;-)

编辑:可运行示例…

查看main方法中的代码-尤其是带有开始-结束注释的代码。 我举了一个很简单的例子,但你应该明白我的意思

哦。。。很抱歉命名类/变量/…;-)

导入ca.odell.glazedlist.BasicEventList;
导入ca.odell.glazedlists.EventList;
导入ca.odell.glazedlist.SortedList;
导入ca.odell.glazedlists.gui.TableFormat;
导入ca.odell.glazedlists.swing.EventTableModel;
导入ca.odell.glazedlists.swing.TableComparatorChooser;
导入java.util.Comparator;
导入java.util.List;
导入javax.swing.ComboBoxEditor;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入org.jdesktop.swingx.JXTable;
公共类测试员{
私有静态类MyObject实现了可比较的{
私人最终整数;
私有最终字符串值;
公共MyObject(整数,字符串值){
这个数字=数字;
这个值=值;
}
public int getNumber(){
返回号码;
}
公共字符串getValue(){
返回值;
}
@凌驾
公共int比较(MyObject t){
返回值.compareTo(t.getValue());
}
}
私有静态类MyTableFormat实现TableFormat{
@凌驾
public int getColumnCount(){
返回2;
}
@凌驾
公共字符串getColumnName(int i){
开关(一){
案例0:
返回“FormattedNumber”;
案例1:
返回“字符串”;
违约:
抛出新的非法状态异常();
}
}
@凌驾
公共对象getColumnValue(MyObject e,int i){
开关(一){
案例0:
返回getNumberString(例如getNumber());
案例1:
返回e.getValue();
违约:
抛出新的非法状态异常();
}
}
私有对象getNumberString(整数){
开关(编号){
案例1:
返回“一”;
案例2:
返回“二”;
案例3:
返回“三”;
违约:
抛出新的非法状态异常();
}
}
}
私有静态类MyComparator实现Comparator{
@凌驾
公共整数比较(MyObject t,MyObject t1){
返回Integer.valueOf(t.getNumber()).compareTo(Integer.valueOf(t1.getNumber());
}
}
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
事件列表=新的基本事件列表();
增加(新的MyObject(1,“A”);
增加(新的MyObject(2,“B”);
增加(新的MyObject(3,“C”);
SortedList SortedList=新的SortedList(列表);
EventTableModel tableModel=新的EventTableModel(sortedList,new MyTableFormat());
JXTable JXTable=新的JXTable(tableModel);
/** 
*开始
*-停用JXTables内置排序
*-安装GlazedList分拣系统
*-为“字符串编号”列设置比较器
*/
//停用JXTable的排序
jxtable.setSortable(false);
jxtable.setAutoCreateRowSorter(false);
jxtable.setRowSorter(空);
//启用GlazedList排序
TableComparatorChooser tcc=TableComparatorChooser.install(jxtable、sortedList、TableComparatorChooser.SINGLE_列);
//为“字符串编号”列设置比较器
列表比较器=tcc.getComparatorsForColumn(0);
比较器;
添加(新的MyComparator());
/**
*结束
*/
JFrame f=新JFrame(“测试仪”);
f、 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f、 getContentPane().add(新的JScrollPane(jxtable));
f、 包装();
f、 setVisible(真);
}
}

也许您必须禁用JXTable排序,以便它不会干扰GL排序?比如:

jxtable.setSortable(false);
jxtable.setAutoCreateRowSorter(false);
jxtable.setRowSorter(null);
。。。然后在表上安装GlazedList TableComparatorChooser,如:

TableComparatorChooser.install(jxtable, sortedFoos, TableComparatorChooser.SINGLE_COLUMN);
或者,您的意思是,您想在表中将5000000格式化为5.0M,而不是在列表中?那你只会