當單擊JToggleButton
時,我有一個JTable
傳遞給另一個類,帶有參數的彈出窗口出現並且JTable
使用RowFilter
過濾參數。當我顯示過濾按預期發生時。但是,當我點擊一個列標題時,排序的行將根據原始的JTable
值進行排序,而不僅僅是篩選後的值。如何在應用RowFilter過濾後禁用列標題排序
如何禁用這種排序?請幫幫我。
當單擊JToggleButton
時,我有一個JTable
傳遞給另一個類,帶有參數的彈出窗口出現並且JTable
使用RowFilter
過濾參數。當我顯示過濾按預期發生時。但是,當我點擊一個列標題時,排序的行將根據原始的JTable
值進行排序,而不僅僅是篩選後的值。如何在應用RowFilter過濾後禁用列標題排序
如何禁用這種排序?請幫幫我。
您可能能夠覆蓋的TableRowSorter
的isSortable(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);
}
}
排序和過濾工作正常,我沒有做什麼特別的事情。
我建議你首先閱讀Swing教程Sorting and Filtering中的部分。
所以下載演示代碼並使用它。將此代碼作爲您的開始代碼,然後使用您的實際表格數據自定義此代碼。