我是这个网站的新手,我需要我自己无法解决的问题。
我已经浏览了很多论坛,并花了很多时间试图解决它,但似乎没有任何正常工作。
所以这是我的情况:

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

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

在公共类中,表,模型和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中没有一个像素发生变化。

抱歉,我在这里几乎是在滥发我的代码,但是我真的不知道错误可能在哪里。只是如果您看到一些东西给我一些提示,以便我可以进行处理。任何想法都非常感谢。

最好的祝福
法尔科·温克勒

最佳答案

一些问题:


当您执行table.setAutoCreateRowSorter(true);时,它将使用默认值替换刚创建的RowSorter。删除该行。
+是正则表达式中的特殊字符。具体来说,它是一个量词,意味要匹配一个或多个前面的标记。由于没有前面的标记,因此正则表达式模式无效。如果您不抑制PatternSyntaxException,它将告诉您。要在正则表达式中匹配文字+,请使用反斜杠将其转义:\+。要在Java源代码的字符串文字中对反斜杠进行编码,请使用另一个反斜杠对其进行转义。即,将newFilter("+");更改为newFilter("\\+");。另外,删除PatternSyntaxException的try-catch。
RowFilter.regexFilter的后续参数是应该对其进行过滤的列的索引。您已经告诉它仅使用列0进行过滤,但是我不确定那是数据中的正确列,因此可能需要更改。如果要对所有列执行过滤,则将其留空。即f = RowFilter.regexFilter(filter);
RowFilter指出要包括的行,但是听起来您想排除包含+的行(也许?)。如果需要,可以使用RowFilter.notFilter反转含义。即rf = RowFilter.notFilter(RowFilter.regexFilter(filter));
//Show all the rows again下插入的代码为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/

10-13 04:31