我是这个网站的新手,我需要帮助来解决我自己无法解决的问题。 我已经扫描了大量的论坛并花了很多时间试图解决它,但似乎没有任何效果。 这是我的场景:
我有一个 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 中没有一个像素发生变化。
我很抱歉大家,我在这里乱发代码,但我真的不知道错误可能出在哪里。如果您看到什么,请给我一点提示,以便我可以解决它。非常感谢任何想法。
最诚挚的问候 法尔科·温克勒
最佳答案
一些问题:
当您执行
table.setAutoCreateRowSorter(true);
时,它会将您刚刚创建的 RowSorter 替换为默认的 RowSorter。删除该行。+
是正则表达式中的特殊字符。具体来说,它是一个量词,表示匹配前面的标记的 1 个或多个。由于没有前面的标记,因此正则表达式模式无效。如果您没有抑制 PatternSyntaxException 它会告诉您这一点。要匹配正则表达式中的文字+
,请使用反斜杠将其转义:\+
。要在 Java 源代码的字符串文字中编码反斜杠,请使用另一个反斜杠对其进行转义。即,将newFilter("+");
更改为newFilter("\\+");
。另外,删除 PatternSyntaxException 的 try-catch。RowFilter.regexFilter
的后续参数是应执行过滤的列的索引。您已经告诉它仅使用第 0 列执行过滤,但我不确定这是否是您数据中的正确列,因此可能需要更改。如果您想对所有列执行过滤,只需将该列留空即可。即,f = RowFilter.regexFilter(filter);
。RowFilter 表示要包含哪些行,但听起来您想要排除包含
+
的行(也许?)。如果需要,您可以使用RowFilter.notFilter
来反转含义。即,rf = RowFilter.notFilter(RowFilter.regexFilter(filter));
。在
//再次显示所有行
下插入的代码将是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/