簡體   English   中英

如何在應用RowFilter過濾后禁用jtable中的列標題排序

[英]How to disable column header sorting in a jtable after RowFilter filtering is applied

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

描述問題的圖像。

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

您可以覆蓋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);
  }
}

排序和過濾對我來說很好,沒有做任何特殊的事情。

我建議你先閱讀Swing教程中有關排序和過濾的部分

所以下載演示代碼並使用它。 將此代碼作為起始代碼,然后使用實際表數據自定義此代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM