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