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

标签 java swing jtable swingx jxtable

我有一个 JXtable。我想防止对前 3 行进行排序。基本上,前 3 行应该始终在最前面,其余的应该根据它们的值进行排序。

SO 上有一个类似的问题,但我不确定如何真正将它应用到我的使用中 Sort ROW except last row

主要区别在于我使用的是 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 - 防止对 jxtable 中的前 3 行进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22391531/

相关文章:

Java Applet 表在运行时不显示

Java随机打印

java - 带有 session 对象的 Spring Junit - 在 Controller 中不可见

java - 使用 POI XWPF 将图像添加到 word .docx 文档标题中

java - MyBatis注解,从bean更新参数

java - Java Applet 中的paint 和draw 方法有什么区别?

java - 从 netbeans 中的 GUI 按钮运行 main 方法

java - 具有自己的对象的组合框

java - 如何在 JTable 渲染器上获得完全突出显示(带边框)

java - 刷新JTable firetableDataChanged未执行