Java TableRowSorter使用TableHeader的外观,但使用自己的比较器

Java TableRowSorter使用TableHeader的外观,但使用自己的比较器,java,swing,look-and-feel,tablerowsorter,Java,Swing,Look And Feel,Tablerowsorter,JavaSE6 ASC/DESC的箭头位于标题文本上方(客户必须有) 我用于在标题文本上方显示箭头: TableRowSorter sorter = new TableRowSorter(); sorter.setModel(table.getModel()); table.setRowSorter(sorter); 或 ASC/DESC的箭头位于标题文本上方,没错。我想使用我自己的比较器,但在我的示例中,调用了比较器,但它不起作用。用我自己的比较器在标题文本排序asc/desc上方的箭头对表

JavaSE6 ASC/DESC的箭头位于标题文本上方(客户必须有)

我用于在标题文本上方显示箭头:

TableRowSorter sorter = new TableRowSorter();
sorter.setModel(table.getModel());
table.setRowSorter(sorter);

ASC/DESC的箭头位于标题文本上方,没错。我想使用我自己的比较器,但在我的示例中,调用了比较器,但它不起作用。用我自己的比较器在标题文本排序asc/desc上方的箭头对表行进行排序时,要更改什么代码

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.Collections;
import java.util.Comparator;
import java.util.Vector;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;

import javax.swing.SwingUtilities; 
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class JTableExample extends JFrame {

    private JTable table;

    private FooTableModel model;

    public JTableExample() {
        super("JTableExample");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
            String plaf = UIManager.getSystemLookAndFeelClassName();
            try {
                UIManager.setLookAndFeel(plaf);
            } 
            catch (ClassNotFoundException e) {} 
            catch (InstantiationException e) {} 
            catch (IllegalAccessException e) {} 
            catch (UnsupportedLookAndFeelException e) {}
            SwingUtilities.updateComponentTreeUI(this);

        Object[][] rowData = { { "a", "c" }, { "b", "b" }, { "c", "a" } };
        Object[] columnHeaders = { "Header1", "Header2" };
        model = new FooTableModel(rowData, columnHeaders);

        table = new JTable(model);
        table.setAutoCreateRowSorter(true);

        table.getTableHeader().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent evt) {
               model.sortByColumn(table.columnAtPoint(evt.getPoint()));
            }
        });

        Container c = getContentPane();
        c.add(new JScrollPane(table), BorderLayout.CENTER);

        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        new JTableExample();
    }

    class FooTableModel extends DefaultTableModel {
        public FooTableModel(Object[][] rowData, Object[] headers) {
            super(rowData, headers);
        }

        public void sortByColumn(final int clm) {
            Collections.sort(this.dataVector, new Comparator() {
                public int compare(Object o1, Object o2) {
                    Vector v1 = (Vector) o1;
                    Vector v2 = (Vector) o2;


                    String s1 = (String) v1.get(clm);
                    String s2 = (String) v2.get(clm);

                    return s1.compareTo(s2);
                }
            });
        }
    }
}

无论您的问题是什么(很难从您的描述中看出),您都在错误地进行排序:在Swing JTable中,排序被认为是视图的责任(与您的实现中的模型相比)

自定义比较器(每列)在rowSorter中配置,类似于:

table.setAutoCreateRowSorter(true);
((TableRowSorter) table.getRowSorter()).setComparator(columnIndex, myComparator);

顺便说一句:排序图标的位置是由LAF控制的,没有什么可以改变的(除了编写自定义LAF)

看不到差异(Win8/Java7),一切正常,有自定义比较器,或者没有,问题是是否真的有必要,只需将L&F移到主管道的开头class@mKorbel我通常的问题是:你的意思是什么?排序图标是可见的(在L&F从constructor移动到主类的适当位置后),然后在JTableHeader(此处张贴的OPs代码)中可以看到排序器和图标,如果我对sorter.setComparator(int,new Comparator(){…请看我删除的帖子here@mKorbel仍然不明白你的意思;-)顺便说一句:在你删除的代码中,你没有使用你用自定义比较器配置的分类器
table.setAutoCreateRowSorter(true);
((TableRowSorter) table.getRowSorter()).setComparator(columnIndex, myComparator);