gpt4 book ai didi

Java - JCheckBox 针对列表进行过滤

转载 作者:行者123 更新时间:2023-12-02 06:42:18 26 4
gpt4 key购买 nike

我有一个 List,其中包含某种类型的 JPA Entity 对象。它们的reference字符串值显示在JList中供用户查看。

我希望我的用户能够在 UI 中选择过滤器作为 JCheckBox,例如“仅来自客户端 x”或“仅类型 x”并动态选择过滤实体列表。

我曾想过只保留static ListcompleteList;staticListfilteredList;的副本,然后每次选择新过滤器时运行单独的过滤器方法UI 来更新 filteredList,这会正常工作,直到您必须取消选择单个过滤器并保留其他过滤器(此时一切都会崩溃)。

我想到的每一种情况都会在某一点或另一点崩溃,通常是在尝试从一个菜单中选择多个过滤器时。

我的思维模式示例,它检查所有过滤器以确定新 JList 中需要包含哪些内容;

public static void filterList(){
List filteredList = new ArrayList<Job>(StoredDataClass.completeList);

if(clientSmithsCheckBox.isSelected()){
for(Job job : filteredList){
if(!job.getClient.equals(clientSmithsCheckBox.getText())){
filteredList.remove(job);
}
}
}

....... // Check other filters here etc.

if(clientBobAndCoCheckBox.isSelected()){
for(Job job : filteredList){
if(!job.getClient.equals(clientBobAndCoCheckBox.getText())){
filteredList.remove(job);
}
}
}

即使选择了 clientBobAndCoCheckBox,最终列表中也不会显示该客户的任何作业,因为我们已经将它们全部删除,因为已经选择了另一个客户。现在,我们可以添加到列表中,但我们会面临类似的问题,例如添加不应该存在的内容等。

这显然是可能的,因为这种类型的过滤系统是常见的做法(例如,excel)。虽然这更多的是一个设计问题,但我怎样才能实现这一点?

最佳答案

这是一个简短(而且原始!)的示例,说明如何组织逻辑。它是在 SwingX 的上下文中(它支持 JList 的排序/过滤,就像 JTable 一样),因为我很懒 - 但您可以轻松地将它应用到您自己的环境中。

将您的条件视为一组可以打开或关闭的过滤器,然后用 OR 将它们组合起来(如果选择了一个或多个),或者如果未选择任何过滤器,则将其关闭。唯一的“技巧”是在其中一个复选框发生更改时评估所有复选框的状态:

final JXList list = new JXList(new DefaultComboBoxModel(Locale.getAvailableLocales()));
list.setAutoCreateRowSorter(true);
final List<RowFilter> filters = new ArrayList<>();
filters.add(new MyRowFilter("de"));
filters.add(new MyRowFilter("ar"));
final List<JCheckBox> boxes = new ArrayList<>();
ActionListener l = new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
List<RowFilter<Object, Object>> orCandidates = new ArrayList<>();
for (int i = 0; i < boxes.size(); i++) {
if (boxes.get(i).isSelected())
orCandidates.add(filters.get(i));
}
RowFilter<Object, Object> or = orCandidates.isEmpty() ? null :
RowFilter.orFilter(orCandidates);
list.setRowFilter(or);
}

};
JCheckBox first = new JCheckBox("de");
first.addActionListener(l);
boxes.add(first);
JCheckBox second = new JCheckBox("ar");
second.addActionListener(l);
boxes.add(second);

JComponent content = new JPanel();
content.add(new JScrollPane(list));
for (JCheckBox box : boxes) {
content.add(box);
}
showInFrame(content, "filters");

// just for completeness, the custom RowFilter
public static class MyRowFilter extends RowFilter {

private String text;
public MyRowFilter(String text) {
this.text = text;
}
@Override
public boolean include(Entry entry) {
Locale locale = (Locale) entry.getValue(0);
return locale.getLanguage().contains(text);
}

}

关于Java - JCheckBox 针对列表进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19024612/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com