【问题标题】:Sorting JTable programmatically以编程方式对 JTable 进行排序
【发布时间】:2021-10-02 22:54:36
【问题描述】:

有没有办法以编程方式对 JTable 进行排序?

我有我的 JTable 的排序工作(使用 setRowSorter),因此当用户按下任何列时,表格会被排序。

我知道,SWingX JXTable 可能会工作,但我宁愿不经历这些麻烦,因为现在其他一切都在正常工作,我不知道 NetBeans 的可视化编辑器如何处理 JX​​Table 等。

编辑: 选定的答案是指我(现已删除)的声明,即 Sun 页面上的答案对我不起作用。那只是我的无知造成的环境问题。

【问题讨论】:

  • 你能贴一些你试过的代码吗?
  • 我可以很容易地将 JXTable 添加到 NetBeans 6.7,所以不要排除它作为一个选项。在你的主项目中尝试之前,也许先做一个小测试项目来玩它。

标签: java swing


【解决方案1】:

对我来说很好用:

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.*;

public class TableBasic extends JPanel
{
    public TableBasic()
    {
        String[] columnNames = {"Date", "String", "Integer", "Boolean"};
        Object[][] data =
        {
            {new Date(), "A", Integer.valueOf(1), Boolean.TRUE },
            {new Date(), "B", Integer.valueOf(2), Boolean.FALSE},
            {new Date(), "C", Integer.valueOf(19), Boolean.TRUE },
            {new Date(), "D", Integer.valueOf(4), Boolean.FALSE}
        };

        DefaultTableModel model = new DefaultTableModel(data, columnNames)
        {
            //  Returning the Class of each column will allow different
            //  renderers and editors to be used based on Class

            public Class getColumnClass(int column)
            {
                switch (column)
                {
                    case 0: return Date.class;
                    case 2: return Integer.class;
                    case 3: return Boolean.class;
                }

                return super.getColumnClass(column);
            }
        };


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

        // DefaultRowSorter has the sort() method

        ArrayList<RowSorter.SortKey> list = new ArrayList<>();
        DefaultRowSorter sorter = ((DefaultRowSorter)table.getRowSorter());
        sorter.setSortsOnUpdates(true);
        list.add( new RowSorter.SortKey(2, SortOrder.ASCENDING) );
        sorter.setSortKeys(list);
        sorter.sort();

        JScrollPane scrollPane = new JScrollPane( table );
        add( scrollPane );
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("Table Basic");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new TableBasic());
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args) throws Exception
    {
        SwingUtilities.invokeLater( () -> createAndShowGUI() );
    }
}

下次遇到问题时发布您的minimal, reproducible example

【讨论】:

  • 你说得对,我的环境有问题,没有使用 Java 端的最新类(我正在做半个 Clojure/半个 Java 项目)。
  • 如果您懒得创建列表,请使用Collections.singletonList(new RowSorter.SortKey(2, SortOrder.ASCENDING))
【解决方案2】:

您还可以通过在JTableRowSorter 上调用toggleSortOrder() 来触发行排序:

table.getRowSorter().toggleSortOrder(columnIndex);

但是请注意,(引用Javadoc):

反转指定列的排序顺序。如果指定的列已经是主排序列,这通常会将排序顺序从升序变为降序(或从降序变为升序)。

虽然它更快,但调用@camickr(对他+1)所示的setSortKeys() 是正确的方法(但您需要实例化List)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 2015-03-25
    • 2019-07-25
    • 2016-09-30
    • 2020-09-04
    相关资源
    最近更新 更多