java - 带有复选框的菜单以过滤 Java 中的 Jtable
问题描述
在我的程序中,我有带有项目的 Jtable。我希望能够根据值(一些布尔值和一些字符串)过滤这些项目。
我尝试过/做过的事情: 我制作了一个包含项目的下拉列表和一个复选框,我可以从下拉列表中进行选择,程序会过滤表格。如果选择了第二个排序(没有最佳名称),它将进一步过滤,否则它将使用我从数据库中提取的“新数据”进行过滤并将其放入 JTable。
代码的作用:我真正想要的是一个菜单/外观类似的东西,其中可以有包含复选框的子菜单,我可以在其中检查我想要过滤的内容。我用 JCheckBoxMenuItem 制作了一个带有子菜单的菜单。我已经制作了 ItemListeners,但我必须为每个制作一个监听器,而且我不知道如何通过菜单检查我已经检查过哪些值。因此,我只能获得 Jtable 的“新鲜”列表或 1 个过滤器。
问题: 如何启用多个过滤器?以及如何创建一个通用侦听器,该侦听器将根据我在菜单中单击的任何复选框以及先前单击的复选框进行过滤?
_sortComboBox.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
String value = _sortComboBox.getSelectedItem().toString();
List<StakeholderRequirement> listToSort = new ArrayList<StakeholderRequirement>();
if(_secondSortCheckBox.isSelected() == true) {
for(int i = 0; i < _stakeholderRequirementTable.getRowCount(); i++) {
listToSort.add(_stakeholderRequirementListTableModel.getRequirementAt(i));
}
} else {
listToSort = _project.getStakeholderRequirementList();
}
List<StakeholderRequirement> filteredList;
switch (value) {
case "All":
_stakeholderRequirementListTableModel.setStakeholderReqList(_project.getStakeholderRequirementList());
break;
case "Accepted":
filteredList = listToSort.stream().filter(StakeholderRequirement -> StakeholderRequirement.isAccepted() == true).collect(Collectors.toList());
_stakeholderRequirementListTableModel.setStakeholderReqList(filteredList);
break;
case "Approved":
filteredList = listToSort.stream().filter(StakeholderRequirement -> StakeholderRequirement.isApproved() == true).collect(Collectors.toList());
_stakeholderRequirementListTableModel.setStakeholderReqList(filteredList);
break;
case "Specified":
filteredList = listToSort.stream().filter(StakeholderRequirement -> StakeholderRequirement.isSpecified() == true).collect(Collectors.toList());
_stakeholderRequirementListTableModel.setStakeholderReqList(filteredList);
break;
case "Validated":
filteredList = listToSort.stream().filter(StakeholderRequirement -> StakeholderRequirement.isValidated() == true).collect(Collectors.toList());
_stakeholderRequirementListTableModel.setStakeholderReqList(filteredList);
break;
case "Verified":
filteredList = listToSort.stream().filter(StakeholderRequirement -> StakeholderRequirement.isVerified() == true).collect(Collectors.toList());
_stakeholderRequirementListTableModel.setStakeholderReqList(filteredList);
break;
}
_stakeholderRequirementListTableModel.fireTableDataChanged();
}
});
.
JMenu _requirementIndicators = new JMenu("Status Indicators");
JCheckBoxMenuItem _RIAccepted = new JCheckBoxMenuItem("Accepted");
_RIAccepted.addItemListener( new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
List<StakeholderRequirement> listToSort = new ArrayList<StakeholderRequirement>();
listToSort = _project.getStakeholderRequirementList();
if(e.getStateChange()== 1) {
List<StakeholderRequirement> filteredList;
filteredList = listToSort.stream().filter(StakeholderRequirement -> StakeholderRequirement.isAccepted() == true).collect(Collectors.toList());
_stakeholderRequirementListTableModel.setStakeholderReqList(filteredList);
} else {
_stakeholderRequirementListTableModel.setStakeholderReqList(listToSort);
}
_stakeholderRequirementListTableModel.fireTableDataChanged();
}
});
解决方案
阅读 Swing 教程中关于排序和过滤的部分,了解过滤基础知识。
本教程包含一个工作示例,该示例在用户在文本字段中键入文本时进行过滤。
在您的情况下,用户将选择一个值,然后您将使用所选值创建过滤器。
如何启用多个过滤器?
//rf = RowFilter.regexFilter("^" + filterText.getText(), 0); // match from beginning
List<RowFilter<Object,Object>> filters = new ArrayList<RowFilter<Object,Object>>(2);
filters.add(RowFilter.regexFilter(filterText.getText(), 0));
filters.add(RowFilter.regexFilter(filterText.getText(), 1));
rf = RowFilter.andFilter(filters);
上面显示了如何修改教程中的过滤器以检查表中两列的值。阅读RowFilter
API。您可以根据需要使用 andFilter 或 orFilter。
推荐阅读
- php - PHP 中会话处理的另一种方法
- mysql - 错误代码:1064。您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册以获取正确的语法
- java - JTextField 正在锁定输入
- mysql - DISTINCT 或 GROUP BY 不起作用。不确定是哪个
- node.js - 重构 NodeJS 项目的中间件代码,使用路由、控制器和模型
- r - 如何在 R 中合并 FASTA 文件
- java - 插口 | PersistantDataContainer() 说无法解决
- python - Networkx viz - 如何在以圆形布局绘制节点之前对节点进行排序?
- android - 如何使用android Pdf查看器库在android应用程序中打开PDF页面内的链接
- c# - 如何在 Controller 类中捕获嵌入模型的 IList