Java 防止对jxtable中的前3行进行排序

Java 防止对jxtable中的前3行进行排序,java,swing,jtable,swingx,jxtable,Java,Swing,Jtable,Swingx,Jxtable,我有一个JXtable。我想阻止对前3行进行排序。基本上,前3行应始终位于顶部,其余行应根据其值进行排序 有一个类似的问题,但我不知道如何真正应用到我的使用 主要区别在于我使用的是JXTable。有没有一个简单的方法可以做到这一点,我错过了 这是我的JXtable代码 jTable1 = new JXTable(); if (isClickable) { jTable1.getTableHeader().setCursor(Cursor.getPredefinedCursor(Curs

我有一个JXtable。我想阻止对前3行进行排序。基本上,前3行应始终位于顶部,其余行应根据其值进行排序

有一个类似的问题,但我不知道如何真正应用到我的使用

主要区别在于我使用的是JXTable。有没有一个简单的方法可以做到这一点,我错过了

这是我的JXtable代码

jTable1 = new JXTable();
if (isClickable) {
    jTable1.getTableHeader().setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));

    //set the sorter here
} else {
    jTable1.setSortable(false);
}

嗯,我花了一点时间尽我所能完善这个,但这是我的工作示例

基本上,我创建了一个名为
ComparableWrapper
的包装器类,它实现了Comparable,因此可以操纵每个列的排序。对于表模型,我添加了一个
setData(Object[][]data)
方法,该方法自动将所有数据值包装在
ComparableWrapper
中。
ComparableWrapper
构造函数中的
sorted
参数确定值应按正常顺序排序,还是无论如何保持在顶部

您必须在一些地方手动更改列的类类型。无论如何,这是我的SSCCE:

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.table.AbstractTableModel;
import org.jdesktop.swingx.JXTable;

public class TableTest extends JFrame {

    public TableTest() {
        super("JXTable - first 3 rows aren't sorted");
        setLayout(new BorderLayout());

        MyTableModel model = new MyTableModel();
        JXTable table = new JXTable();
        table.setModel(model);

        Object[][] initialData = {
            {"Zoe", new Integer(26)},
            {"Adam", new Integer(29)},
            {"Trisha", new Integer(33)},
            {"Reed", new Integer(20)},
            {"John", new Integer(3)},
            {"Kyle", new Integer(102)},
            {"Billy Bob", new Integer(27)},
            {"Sandra", new Integer(87)},
            {"Steve", new Integer(50)},
            {"Guy", new Integer(23)},
            {"Kenzie", new Integer(25)},
            {"Mary", new Integer(27)},
            {"Sally", new Integer(12)},
            {"Joe", new Integer(101)},
            {"Billy", new Integer(44)},
            {"Bob", new Integer(83)},
        };
        model.setData(initialData);

        JScrollPane tableScroll = new JScrollPane(table);
        add(tableScroll, BorderLayout.CENTER);

        table.setFillsViewportHeight(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 600);
        setVisible(true);
        setLocationRelativeTo(null);
    }

    private class MyTableModel extends AbstractTableModel {

        String[] columns = { "First Name", "Age" };
        Object[][] data = {};

        public void setData(Object[][] data) {
            for (int i=0; i<data.length; i++) {
                // Don't sort top 3 rows
                boolean sorted = i < 3 ? false : true;

                // Wrap each object so the sorting can be manipulated.
                // Change these class types as needed.
                data[i][0] = new ComparableWrapper<String>((String) data[i][0], sorted);
                data[i][1] = new ComparableWrapper<Integer>((Integer) data[i][1], sorted);
            }
            this.data = data;
            fireTableDataChanged();
        }

        @Override
        public Class<?> getColumnClass(int col) {
            return ComparableWrapper.class;
        }

        @Override
        public int getColumnCount() {
            return columns.length;
        }

        @Override
        public int getRowCount() {
            return data.length;
        }

        @Override
        public Object getValueAt(int row, int col) {
            return data[row][col];
        }

        @Override
        public String getColumnName(int col) {
            return columns[col];
        }

    }

    private class ComparableWrapper<T> implements Comparable<ComparableWrapper<T>> {

        private Comparable<T> object;
        private boolean sorted;

        public ComparableWrapper(Comparable<T> object, boolean sorted) {
            this.object = object;
            this.sorted = sorted;
        }

        @Override
        public int compareTo(ComparableWrapper<T> o) {
            if (object instanceof Comparable<?>) {
                if (sorted && o.isSorted()) {
                    // Sort normally by default
                    return object.compareTo(o.getObject());
                } else {
                    // If an un-sorted row is being compared, don't compare at all
                    return 0;
                }
            }

            // Fallback
            return 0;
        }

        public T getObject() {
            return (T) object;
        }

        public boolean isSorted() {
            return sorted;
        }

        @Override
        public String toString() {
            return object.toString();
        }

    }

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

}
导入java.awt.BorderLayout;
导入javax.swing.JFrame;
导入javax.swing.JScrollPane;
导入javax.swing.table.AbstractTableModel;
导入org.jdesktop.swingx.JXTable;
公共类TableTest扩展了JFrame{
公共表格测试(){
super(“JXTable-前3行未排序”);
setLayout(新的BorderLayout());
MyTableModel模型=新的MyTableModel();
JXTable table=新的JXTable();
表2.setModel(model);
对象[][]初始数据={
{“Zoe”,新整数(26)},
{“亚当”,新整数(29)},
{“Trisha”,新整数(33)},
{“里德”,新整数(20)},
{“John”,新整数(3)},
{“凯尔”,新整数(102)},
{“Billy Bob”,新整数(27)},
{“Sandra”,新整数(87)},
{“Steve”,新的整数(50)},
{“Guy”,新整数(23)},
{“Kenzie”,新整数(25)},
{“玛丽”,新整数(27)},
{“Sally”,新整数(12)},
{“Joe”,新的整数(101)},
{“比利”,新的整数(44)},
{“Bob”,新整数(83)},
};
model.setData(initialData);
JScrollPane tableScroll=新的JScrollPane(表);
添加(tableScroll、BorderLayout.CENTER);
表.setFillsViewPerthweight(真);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
设置大小(400600);
setVisible(真);
setLocationRelativeTo(空);
}
私有类MyTableModel扩展了AbstractTableModel{
String[]columns={“First Name”,“Age”};
对象[][]数据={};
公共void setData(对象[][]数据){

对于(int i=0;我不确定该链接是否适用。该链接指的是标题的分组。有没有评论为什么您认为该线程的类似部分或任何特定部分我应该重新阅读?我认为有多行标题可能就像有顶部行固定在排序上一样。谢谢,下次会有更多。当我运行此链接时,不会有数据被添加d到jxtable。@codennija对不起,我忘了添加
fireTableDataChanged()
到表模型上的
setData
方法。这样,它将通知表数据已更新。我已更新了答案。
fireTableDataChanged
填充了表。现在,当我单击带有名称的标题时,我得到以下错误:
线程“AWT-EventQueue-0”中的异常java.lang.ClassCastException:javaapplication4.javaapplication4$ComparableWrapper不能强制转换为java.lang.String
@codeNinja抱歉,我忘记了我做的另一个小更新-表模型中的
classes
数组实际上根本不需要。只需更改
getColumnClass
方法以返回
ComparableWrap即可per.class
。我已经更新了我的答案,以反映这一点。谢谢!非常好的答案和一个工作示例。奖金归你。