2015-12-03 62 views
2

當單擊JToggleButton時,我有一個JTable傳遞給另一個類,帶有參數的彈出窗口出現並且JTable使用RowFilter過濾參數。當我顯示過濾按預期發生時。但是,當我點擊一個列標題時,排序的行將根據原始的JTable值進行排序,而不僅僅是篩選後的值。如何在應用RowFilter過濾後禁用列標題排序

The Image describing the issue.

如何禁用這種排序?請幫幫我。

回答

2

您可能能夠覆蓋的TableRowSorterisSortable(int)方法,以防止該列被排序:

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

public class DisableSortingTest { 
    private static String[] columnNames = {"ID", "NAME", "SALARY"}; 
    private static Object[][] data = { 
    {1, "abcd", 2000}, 
    {2, "xyz", 1800}, 
    {3, "ijkl", 4600}, 
    {4, "pqrs", 3400}, 
    {5, "efgh", 5000} 
    }; 
    private final DefaultTableModel model = new DefaultTableModel(data, columnNames) { 
    @Override public Class<?> getColumnClass(int column) { 
     return getValueAt(0, column).getClass(); 
    } 
    }; 
    private final JCheckBox checkBox = new JCheckBox("filter"); 
    private final RowFilter<TableModel, Integer> filter = new RowFilter<TableModel, Integer>() { 
    @Override public boolean include(Entry<? extends TableModel, ? extends Integer> entry) { 
     return "pqrs".equals(entry.getModel().getValueAt(entry.getIdentifier(), 1)); 
    } 
    }; 
    private final JTable table = new JTable(model); 
    private final TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model) { 
    @Override public boolean isSortable(int column) { 
     return getRowFilter() == null; 
    } 
    }; 
    public JComponent makeUI() { 
    table.setRowSorter(sorter); 
    checkBox.addActionListener(new ActionListener() { 
     @Override public void actionPerformed(ActionEvent e) { 
     JCheckBox c = (JCheckBox) e.getSource(); 
     sorter.setRowFilter(c.isSelected() ? filter : null); 
     sorter.setSortKeys(null); 
     } 
    }); 
    JPanel p = new JPanel(new BorderLayout()); 
    p.add(checkBox, BorderLayout.NORTH); 
    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 DisableSortingTest().makeUI()); 
    f.setSize(320, 240); 
    f.setLocationRelativeTo(null); 
    f.setVisible(true); 
    } 
} 
1

排序和過濾工作正常,我沒有做什麼特別的事情。

我建議你首先閱讀Swing教程Sorting and Filtering中的部分。

所以下載演示代碼並使用它。將此代碼作爲您的開始代碼,然後使用您的實際表格數據自定義此代碼。

相關問題