java - 如何使用 AbstractDataModel 过滤 JTable?

标签 java regex swing jtable rowfilter

我是这个网站的新手,我需要帮助来解决我自己无法解决的问题。 我已经扫描了大量的论坛并花了很多时间试图解决它,但似乎没有任何效果。 这是我的场景:

我有一个 jtable,其中填充了文件中的大量数据。它包含值(value)观, 并且每个值都有一个正常范围。单击复选框时,我只想显示包含超出正常范围的值的行。为此,我添加了一个额外的列,其中包含该指示符(++、+、-、--)。由于我不必对这些值进行进一步的计算,因此我将数据模型设置为字符串数组。

到目前为止我的代码结构是:

在公共(public)类中,表、模型和TableRowSorter被初始化。

public class Auswertung extends JFrame {

      TableModel model = new MyTableModel();


      TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);

      JTable  table = new JTable (model);

      JScrollPane scrollPane = new JScrollPane(table);
}

在构造函数类中设置行排序器以及自动行排序器。

   public Auswertung(){
    table.setRowSorter(sorter);
    table.setAutoCreateRowSorter(true);
   }

抽象表模型如下所示:

 class MyTableModel extends AbstractTableModel {

      String [] columnNames = {"param","unit", "old", "new","norm range", "1", "2", "3", "4", "indicator"};
      String [][] tableData = measurements;
      @Override
        public int getRowCount()
        {
            return tableData.length;
        }

        @Override
        public int getColumnCount()            
        {
            return columnNames.length;
        }

        @Override
        public Object getValueAt(int row, int column)
        {        
            return tableData[row][column];
        }

        //Used by the JTable object to set the column names
        @Override
        public String getColumnName(int column) {
            return columnNames[column];
        }



        @Override
        public boolean isCellEditable(int row, int column)
        {
           if (column == 0 || column == 1)
       {
            return false;
       }
       else
       {
        return true;
       }
        }






 }

它工作得很好 - 它将从文件收集的数据(测量 [][] ,这个数组用另一种方法填充)移交给 JTable - 到目前为止一切都很酷。所以现在我尝试在单击复选框时整理出不相关的行。 所以我写了这个由复选框的actionPerformed触发的类:

public class sortRelevant implements  ActionListener {

    private void newFilter(String filter) {
        RowFilter<? super TableModel, ? super Integer> rf = null;
        //If current expression doesn't parse, don't update.
        try {
            rf = RowFilter.regexFilter(filter, 0);
        } catch (java.util.regex.PatternSyntaxException e) {
            return;

        }
        sorter.setRowFilter(rf);
    }

    public void actionPerformed(ActionEvent arg0) {

        // TODO Auto-generated method stub
        if(onlysortRelevant.isSelected()){
            //sort out the not relevant
            newFilter("+");

        }else{

            //Show all the rows again
        }

    }

}

据我了解,这段代码应该设置一个正则表达式过滤器,该过滤器在 JTable 数据模型中的某个字符串之后进行扫描。应删除此数据模型中不包含此字符串的行(首先,我很乐意对最后一列中具有“+”的行进行排序)。我发布的代码不会引发异常,并且所有方法都会被触发,但是当我单击复选框时,JTable 中没有一个像素发生变化。

我很抱歉大家,我在这里乱发代码,但我真的不知道错误可能出在哪里。如果您看到什么,请给我一点提示,以便我可以解决它。非常感谢任何想法。

最诚挚的问候 法尔科·温克勒

最佳答案

一些问题:

  1. 当您执行table.setAutoCreateRowSorter(true);时,它会将您刚刚创建的 RowSorter 替换为默认的 RowSorter。删除该行。

  2. + 是正则表达式中的特殊字符。具体来说,它是一个量词,表示匹配前面的标记的 1 个或多个。由于没有前面的标记,因此正则表达式模式无效。如果您没有抑制 PatternSyntaxException 它会告诉您这一点。要匹配正则表达式中的文字 +,请使用反斜杠将其转义:\+。要在 Java 源代码的字符串文字中编码反斜杠,请使用另一个反斜杠对其进行转义。即,将 newFilter("+"); 更改为 newFilter("\\+");。另外,删除 PatternSyntaxException 的 try-catch。

  3. RowFilter.regexFilter 的后续参数是应执行过滤的列的索引。您已经告诉它仅使用第 0 列执行过滤,但我不确定这是否是您数据中的正确列,因此可能需要更改。如果您想对所有列执行过滤,只需将该列留空即可。即,f = RowFilter.regexFilter(filter);

  4. RowFilter 表示要包含哪些行,但听起来您想要排除包含 + 的行(也许?)。如果需要,您可以使用 RowFilter.notFilter 来反转含义。即,rf = RowFilter.notFilter(RowFilter.regexFilter(filter));

  5. //再次显示所有行下插入的代码将是sorter.setRowFilter(null);

这应该可以正常工作。但是,如果为了整洁起见,您不希望显示带有 +/- 符号的列,则可以从表中删除该列,并创建 RowFilter 的自定义实现,该实现直接对模型中的数据进行操作,以进行测试这些值是否处于动态范围内或超出范围。我不知道您的数据是什么样的,所以这是一个玩具示例:

sorter.setRowFilter(new RowFilter<TableModel,Integer>() {
    @Override
    public boolean include(RowFilter.Entry<? extends TableModel,? extends Integer> row) {
        // only include rows that have a cat in column 0
        return row.getValue(0).toString().contains("cat");
    }
});

希望这有帮助。

关于java - 如何使用 AbstractDataModel 过滤 JTable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25005302/

相关文章:

java - 如何通过使用正则表达式排除同一圆括号中的内容来仅匹配圆括号

java - 使用组件/值加载 JList

java - 从 JToolbar 中拖动 JFrame

java - Jhipster 应用程序中未启用生产模式

java - 使用 hibernate 在 Postgres 上设置随机种子

java - 无法运行使用 ContainerResponseFilter 实现的过滤器

java - 卖出股票的最大利润

regex - SAS 中的正则表达式匹配

Javascript 正则表达式在选择正斜杠时中断

java - 用Java绘制折线图