Java 基于隐藏列的JTable排序

Java 基于隐藏列的JTable排序,java,swing,sorting,jtable,tablerowsorter,Java,Swing,Sorting,Jtable,Tablerowsorter,我想根据一个隐藏列对JTable行进行排序 假设我有一个像这样的JTable column1 column2 val1 val2 现在我又有一个隐藏的专栏,我不想展示。当用户单击Column2时,它应该根据Column3(隐藏列)而不是Column2对行进行排序 如何在JTable中实现这一点 使用此处发布的代码: 有变量/方法参数col-只需检查它是否属于您的列2,如果是,则将其视为您的隐藏列-按它排序并重新排序表。默认情况下,您可以添加到,但没有比Darryl的更好、更清晰

我想根据一个隐藏列对
JTable
行进行排序

假设我有一个像这样的JTable

column1   column2
val1       val2
现在我又有一个隐藏的专栏,我不想展示。当用户单击Column2时,它应该根据Column3(隐藏列)而不是Column2对行进行排序

如何在JTable中实现这一点

使用此处发布的代码:

有变量/方法参数
col
-只需检查它是否属于您的列2,如果是,则将其视为您的隐藏列-按它排序并重新排序表。

默认情况下,您可以添加到,但没有比Darryl的更好、更清晰的了

注:RowSorter的定义仅对混凝土表列有效

siple示例(再次使用较少的平衡器)

import java.awt.*;
导入java.awt.event.*;
导入javax.swing.*;
导入javax.swing.table.*;
公共类标题双击测试{
私有字符串[]列名称={“字符串”、“整数”、“布尔值”};
私有对象[][]数据={
{“aaa”,12,正确},{“bbb”,5,错误},
{“CCC”,92,true},{“DDD”,0,false}
};
private TableModel model=新的DefaultTableModel(数据、列名){
私有静态最终长serialVersionUID=1L;
@凌驾
公共类getColumnClass(int列){
返回getValueAt(0,列).getClass();
}
};
专用JTable表=新JTable(模型);
私有JTableHeader;
静态类TestTableRowSorter扩展了TableRowSorter{
TestTableRowSorter(表格型号m){
超级(m);
}
@凌驾
公共无效切换排序器(int列){
}
public void wraptogglesortororder(int列){
super.toggleSortOrder(列);
}
}
私有计时器=新计时器(400,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
系统输出打印项次(“单一”);
JTable table=header.getTable();
行分拣机;
if(pt!=null&&table!=null&&table(sorter=table.getRowSorter())!=null){
int columnIndex=页眉.columnAtPoint(pt);
如果(列索引!=-1){
columnIndex=table.convertColumnIndexToModel(columnIndex);
((TestTableRowSorter)分类器)。WraptogleSortOrder(columnIndex);
}
}
}
});
私人点;
公共JComponent makeUI(){
timer.setRepeats(假);
表.setRowSorter(新测试表RowSorter(型号));
header=table.getTableHeader();
header.addMouseListener(新的MouseAdapter(){
@凌驾
公共无效鼠标点击(最终鼠标事件e){
if(timer.isRunning()&&!e.isConsumed()&&e.getClickCount()>1){
系统输出打印项次(“双”);
pt=null;
timer.stop();
}否则{
pt=e.getPoint();
timer.restart();
}
}
});
JPanel p=newjpanel(newborderlayout());
p、 添加(新JScrollPane(表));
返回p;
}
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
@凌驾
公开募捐{
createAndShowGUI();
}
});
}
公共静态void createAndShowGUI(){
JFrame f=新的JFrame();
f、 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f、 getContentPane().add(新建标题DoubleClickTest().makeUI());
f、 设置大小(320240);
f、 setLocationRelativeTo(空);
f、 setVisible(真);
}
}

一种方法是实现类型
列2
的接口,如图所示,并使用相应的
列3
值进行比较。方便的是,如果
Column3
已经实现了
Comparable
,您可以直接委托给
Column3
,就像使用
Double

一样,我是否需要将hiddlen列索引传递给WraptogleSortOrder(int列)?它会根据隐藏列进行排序吗?@Umesh:这是一个很好的例子,可以拦截标题单击并区分单击和双击,如果您还需要该功能的话;但它并没有直接处理排序顺序。另见此+1对于。为了迷惑用户;-)+1这可能有助于支持旧版本;另见此。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;

public class HeaderDoubleclickTest {

    private String[] columnNames = {"String", "Integer", "Boolean"};
    private Object[][] data = {
        {"aaa", 12, true}, {"bbb", 5, false},
        {"CCC", 92, true}, {"DDD", 0, false}
    };
    private TableModel model = new DefaultTableModel(data, columnNames) {

        private static final long serialVersionUID = 1L;

        @Override
        public Class<?> getColumnClass(int column) {
            return getValueAt(0, column).getClass();
        }
    };
    private JTable table = new JTable(model);
    private JTableHeader header;

    static class TestTableRowSorter extends TableRowSorter<TableModel> {

        TestTableRowSorter(TableModel m) {
            super(m);
        }

        @Override
        public void toggleSortOrder(int column) {
        }

        public void wrapToggleSortOrder(int column) {
            super.toggleSortOrder(column);
        }
    }
    private Timer timer = new Timer(400, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("single");
            JTable table = header.getTable();
            RowSorter sorter;
            if (pt != null && table != null && (sorter = table.getRowSorter()) != null) {
                int columnIndex = header.columnAtPoint(pt);
                if (columnIndex != -1) {
                    columnIndex = table.convertColumnIndexToModel(columnIndex);
                    ((TestTableRowSorter) sorter).wrapToggleSortOrder(columnIndex);
                }
            }
        }
    });
    private Point pt;

    public JComponent makeUI() {
        timer.setRepeats(false);
        table.setRowSorter(new TestTableRowSorter(model));
        header = table.getTableHeader();
        header.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(final MouseEvent e) {
                if (timer.isRunning() && !e.isConsumed() && e.getClickCount() > 1) {
                    System.out.println("double");
                    pt = null;
                    timer.stop();
                } else {
                    pt = e.getPoint();
                    timer.restart();
                }
            }
        });
        JPanel p = new JPanel(new BorderLayout());
        p.add(new JScrollPane(table));
        return p;
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }

    public static void createAndShowGUI() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.getContentPane().add(new HeaderDoubleclickTest().makeUI());
        f.setSize(320, 240);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
}