启用和禁用动态排序JTable

时间:2014-03-15 18:44:24

标签: java swing sorting jtable rowsorter

我是Java Swing的新手,我正在使用JTable。

实际上,我很难对这个组件进行排序。

我想以编程方式启用和禁用此功能。

我使用JTable.setAutoCreateSorter(true)初始化它,我改为假,没有任何事情发生。

另外,我使用JTable.setRowSorter(null),它有效,但我不知道如何再次启用它。

抱歉我的英语不好!

2 个答案:

答案 0 :(得分:3)

您可以使用DefaultRowSorter的setSortable(int index, boolean sortable)方法。

    for (int i=0 ; i<table.getColumnCount() ; i++) {
        sorter.setSortable(i, false);
    }

这对我有用。另请参阅JTable sorting programatically only

答案 1 :(得分:2)

检查JTable.setAutoCreateRowSorter(boolean autoCreateRowSorter)源代码:

public void setAutoCreateRowSorter(boolean autoCreateRowSorter) {
    boolean oldValue = this.autoCreateRowSorter;
    this.autoCreateRowSorter = autoCreateRowSorter;
    if (autoCreateRowSorter) {
        setRowSorter(new TableRowSorter<TableModel>(getModel()));
    }
    firePropertyChange("autoCreateRowSorter", oldValue,
                       autoCreateRowSorter);
}

所以,你有两个选择:

  • 保留对行分类器的引用,以便稍后恢复,如@nachokk建议的那样。
  • 设置新的TableRowSorter个实例:

    table.setRowSorter(new TableRowSorter(table.getModel()));

修改

  

但现在表的行不可选

这很奇怪,我对行选择没有任何问题。这是我用来测试我的答案的代码:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableRowSorter;

public class Demo {

    private void createAndShowGUI() {

        DefaultTableModel model = new DefaultTableModel(new Object[]{"Column # 1", "Column # 2"}, 0){
            @Override
            public Class<?> getColumnClass(int columnIndex) { 
                switch(columnIndex) {
                    case 0: return String.class;
                    case 1: return Integer.class;
                        default: return super.getColumnClass(columnIndex);
                }
            }            
        };

        for (int i = 0; i < 20; i++) {
            model.addRow(new Object[]{"Property # " + i, Integer.valueOf(i)});            
        }

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

        JToggleButton toggleButton = new JToggleButton("Disable", true);
        toggleButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JToggleButton toggleButton = (JToggleButton)e.getSource();

                String text = toggleButton.isSelected() ? "Disable" : "Enable";
                TableRowSorter sorter = toggleButton.isSelected() ? new TableRowSorter(table.getModel()) : null;

                toggleButton.setText(text);
                table.setRowSorter(sorter);

            }
        });

        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(new JScrollPane(table), BorderLayout.CENTER);
        frame.add(toggleButton, BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {                
                new Demo().createAndShowGUI();
            }
        });
    }
}