基于具有相同数据的两个不同列的值的 JTable 行过滤
JTable row filtering based on values of two different columns that Have same data
我有 JTable,其中包含如下数据:
------------------------
| Name | Num 1 | Num 2 |
------------------------
| Data | 9 | 0 |
| Data | 17 | 24 |
| Data | 0 | 0 |
| Data | 0 | 5 |
------------------------
我有一个 RowFilter
必须隐藏一个包含 0 的行 Num 1
和 Num 2
!
sorter = new TableRowSorter<>(((model)));
List<RowFilter<Object, Object>> rfs = new ArrayList<>(2);
String regexHider1 = "(?i)^" + "0" + "$";
String regexHider2 = "(?i)^" + "0" + "$";
rfs.add(RowFilter.notFilter(RowFilter.regexFilter(regexHider1, 1)));
rfs.add(RowFilter.notFilter(RowFilter.regexFilter(regexHider1, 2)));
RowFilter<Object, Object> af = RowFilter.andFilter(rfs);
sorter.setRowFilter(af);
jTable1.setRowSorter(sorter);
输出是:
------------------------
| Name | Num 1 | Num 2 |
------------------------
| Data | 17 | 24 |
------------------------
但如果 Num 1
和 Num 2
都包含 0,我需要隐藏!
我需要的是这样的:
------------------------
| Name | Num 1 | Num 2 |
------------------------
| Data | 9 | 0 |
| Data | 17 | 24 |
| Data | 0 | 5 |
------------------------
只隐藏了 1 行,因为只有 1 行在 Num1 和 Num2 上包含 0
示例代码:
package Classes;
import java.awt.FlowLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.RowSorter;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class JTableExample {
DefaultTableModel model = new DefaultTableModel();
public JFrame frame = new JFrame();
public RowSorter<TableModel> sortert = new TableRowSorter<>(model);
public TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(((model)));
public JTableExample() {
String[] cols = {"Name", "Num 1", "Num 2"};
JTable table = new JTable(model);
table.setModel(model);
model.setColumnIdentifiers(cols);
model.addRow(new Object[]{"Data", 9, 0});
model.addRow(new Object[]{"Data", 17, 24});
model.addRow(new Object[]{"Data", 0, 0});
model.addRow(new Object[]{"Data", 0, 5});
JButton btn = new JButton();
btn.setText("Filter");
btn.addActionListener((e) -> {
sorter = new TableRowSorter<>(((model)));
List<RowFilter<Object, Object>> rfs = new ArrayList<>(2);
String regexHider1 = "(?i)^" + "0" + "$";
String regexHider2 = "(?i)^" + "0" + "$";
rfs.add(RowFilter.notFilter(RowFilter.regexFilter(regexHider1, 1)));
rfs.add(RowFilter.notFilter(RowFilter.regexFilter(regexHider2, 2)));
RowFilter<Object, Object> af = RowFilter.andFilter(rfs);
sorter.setRowFilter(af);
table.setRowSorter(sorter);
});
JPanel jdb = new JPanel();
jdb.setLayout(new FlowLayout());
jdb.add(table);
jdb.add(btn);
jdb.add(table);
frame.add(jdb);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new JTableExample();
}
});
}
}
看起来“notFilter”用错了地方。这似乎有效:
List<RowFilter<Object, Object>> rfs = new ArrayList<>(2);
rfs.add(RowFilter.numberFilter(RowFilter.ComparisonType.EQUAL, 0, 1));
rfs.add(RowFilter.numberFilter(RowFilter.ComparisonType.EQUAL, 0, 2));
RowFilter<Object, Object> af = RowFilter.andFilter(rfs);
sorter = new TableRowSorter<>(((model)));
sorter.setRowFilter( RowFilter.notFilter(af) );
table.setRowSorter(sorter);
我还尝试使用自定义 RowFilter:
RowFilter<Object,Object> rf = new RowFilter<Object,Object>()
{
public boolean include(Entry<? extends Object, ? extends Object> entry)
{
Integer column1 = (Integer)entry.getValue(1);
Integer column2 = (Integer)entry.getValue(2);
if (column1.intValue() == 0 && column2.intValue() == 0)
return false;
else
return true;
}
};
sorter = new TableRowSorter<>(((model)));
sorter.setRowFilter(rf);
table.setRowSorter(sorter);
注意:在这两种情况下,过滤器都需要整数数据,因此如果您编辑列并将值更改为 0,过滤器将不起作用,因为模型将更新为字符串值。我假设您真正的 TableModel 会将最后 2 列的 getColumnClass()
方法覆盖为 return Integer.class。
我有 JTable,其中包含如下数据:
------------------------
| Name | Num 1 | Num 2 |
------------------------
| Data | 9 | 0 |
| Data | 17 | 24 |
| Data | 0 | 0 |
| Data | 0 | 5 |
------------------------
我有一个 RowFilter
必须隐藏一个包含 0 的行 Num 1
和 Num 2
!
sorter = new TableRowSorter<>(((model)));
List<RowFilter<Object, Object>> rfs = new ArrayList<>(2);
String regexHider1 = "(?i)^" + "0" + "$";
String regexHider2 = "(?i)^" + "0" + "$";
rfs.add(RowFilter.notFilter(RowFilter.regexFilter(regexHider1, 1)));
rfs.add(RowFilter.notFilter(RowFilter.regexFilter(regexHider1, 2)));
RowFilter<Object, Object> af = RowFilter.andFilter(rfs);
sorter.setRowFilter(af);
jTable1.setRowSorter(sorter);
输出是:
------------------------
| Name | Num 1 | Num 2 |
------------------------
| Data | 17 | 24 |
------------------------
但如果 Num 1
和 Num 2
都包含 0,我需要隐藏!
我需要的是这样的:
------------------------
| Name | Num 1 | Num 2 |
------------------------
| Data | 9 | 0 |
| Data | 17 | 24 |
| Data | 0 | 5 |
------------------------
只隐藏了 1 行,因为只有 1 行在 Num1 和 Num2 上包含 0
示例代码:
package Classes;
import java.awt.FlowLayout;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.RowFilter;
import javax.swing.RowSorter;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;
public class JTableExample {
DefaultTableModel model = new DefaultTableModel();
public JFrame frame = new JFrame();
public RowSorter<TableModel> sortert = new TableRowSorter<>(model);
public TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(((model)));
public JTableExample() {
String[] cols = {"Name", "Num 1", "Num 2"};
JTable table = new JTable(model);
table.setModel(model);
model.setColumnIdentifiers(cols);
model.addRow(new Object[]{"Data", 9, 0});
model.addRow(new Object[]{"Data", 17, 24});
model.addRow(new Object[]{"Data", 0, 0});
model.addRow(new Object[]{"Data", 0, 5});
JButton btn = new JButton();
btn.setText("Filter");
btn.addActionListener((e) -> {
sorter = new TableRowSorter<>(((model)));
List<RowFilter<Object, Object>> rfs = new ArrayList<>(2);
String regexHider1 = "(?i)^" + "0" + "$";
String regexHider2 = "(?i)^" + "0" + "$";
rfs.add(RowFilter.notFilter(RowFilter.regexFilter(regexHider1, 1)));
rfs.add(RowFilter.notFilter(RowFilter.regexFilter(regexHider2, 2)));
RowFilter<Object, Object> af = RowFilter.andFilter(rfs);
sorter.setRowFilter(af);
table.setRowSorter(sorter);
});
JPanel jdb = new JPanel();
jdb.setLayout(new FlowLayout());
jdb.add(table);
jdb.add(btn);
jdb.add(table);
frame.add(jdb);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new JTableExample();
}
});
}
}
看起来“notFilter”用错了地方。这似乎有效:
List<RowFilter<Object, Object>> rfs = new ArrayList<>(2);
rfs.add(RowFilter.numberFilter(RowFilter.ComparisonType.EQUAL, 0, 1));
rfs.add(RowFilter.numberFilter(RowFilter.ComparisonType.EQUAL, 0, 2));
RowFilter<Object, Object> af = RowFilter.andFilter(rfs);
sorter = new TableRowSorter<>(((model)));
sorter.setRowFilter( RowFilter.notFilter(af) );
table.setRowSorter(sorter);
我还尝试使用自定义 RowFilter:
RowFilter<Object,Object> rf = new RowFilter<Object,Object>()
{
public boolean include(Entry<? extends Object, ? extends Object> entry)
{
Integer column1 = (Integer)entry.getValue(1);
Integer column2 = (Integer)entry.getValue(2);
if (column1.intValue() == 0 && column2.intValue() == 0)
return false;
else
return true;
}
};
sorter = new TableRowSorter<>(((model)));
sorter.setRowFilter(rf);
table.setRowSorter(sorter);
注意:在这两种情况下,过滤器都需要整数数据,因此如果您编辑列并将值更改为 0,过滤器将不起作用,因为模型将更新为字符串值。我假设您真正的 TableModel 会将最后 2 列的 getColumnClass()
方法覆盖为 return Integer.class。