【问题标题】:Bind two JComboBox filters绑定两个 JComboBox 过滤器
【发布时间】:2016-09-08 15:14:33
【问题描述】:

我有两个组合框,每个组合框过滤我的 JTable 的不同行,我想做的是在每个用户选择时维护我的过滤器,

示例

目前

第一个 ComboBox 选择选项 A,表格被过滤,仅显示选项 A

第二个组合框选择选项 B,表格被过滤,仅显示选项 B

我需要的是:

第一个 ComboBox 选择选项 A,表格被过滤,显示选项 A 的匹配案例

然后

第二个组合框选择选项 B 和表必须显示匹配大小写的第一个组合框和第二个组合框显示选项'A + B'的值

这是我单独过滤表格的 ComboBox 代码:

comboBox.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent event) {
        RowFilter<DefaultTableModel, Object> rf  = RowFilter.regexFilter(comboBox.getSelectedItem().toString(), 2);
        sorter.setRowFilter(rf);
    }
});

comboBox_1.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent event) {
        RowFilter<DefaultTableModel, Object> rf  = RowFilter.regexFilter(comboBox_1.getSelectedItem().toString(), 3);
        sorter.setRowFilter(rf);                
    }
});

那么有没有办法在选择一个选项时始终匹配两个组合框的大小写?

【问题讨论】:

    标签: java swing combobox


    【解决方案1】:

    您可以使用类似的东西,它使用 ComboBoxModel,因此您可以动态地将元素添加到您的 JComboBox:

    Integer[] optionsForA = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; 
    JComboBox comboBoxA = new JComboBox(optionsForA);//A
    Vector comboItems = newVector();
    comboItems.add("A");
    comboItems.add("B");
    comboItems.add("C");
    comboItems.add("D");
    comboItems.add("E");
    final DefaultComboBoxModel mod = new DefaultComboBoxModel(comboItems);
    JComboBox comboBoxB = new JComboBox(mod);//B
    
    actionsCB.addActionListener(new ActionListener() {
    
            public void actionPerformed(ActionEvent e) {
                if()//your condition { 
    
                    for (int i = numbers.lenght; i < numbers.length + mod.size() ; i++) {
                        mod.addElement(optionsForA[i]); //add options from A to B
    
                    }            
                }
            }
        });
    

    有关向 JComboBox 动态添加选项的更多信息,请查看此帖子:Dynamically adding items to a JComboBox 或者这里的 DefaultComboBoxModel API:https://docs.oracle.com/javase/7/docs/api/javax/swing/DefaultComboBoxModel.html

    希望对您有所帮助!

    【讨论】:

      【解决方案2】:

      使用RowFilter.andFilter() 允许使用AND 逻辑将多个过滤器应用于单个JTable(仅当两个过滤器都为真时,才会显示该项目)(还有一个OR、@987654325 @,...)。

      尚未测试,但我想这样的方法可以工作:

      // Collection of filters to be applied to your table
      List<RowFilter<DefaultTableModel, Object>> filters = new ArrayList<>();
      
      comboBox.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent event) {
              if(filters.isEmpty())
                  filters.add(RowFilter.regexFilter(comboBox.getSelectedItem().toString(), 2));
              else
                  filters.set(0, RowFilter.regexFilter(comboBox.getSelectedItem().toString(), 2));
              // Apply filters
              sorter.setRowFilter(RowFilter.andFilter(filters));
          }
      });
      
      comboBox_1.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent event) {
              if(filters.size() < 2)
                  filters.add(RowFilter.regexFilter(comboBox_1.getSelectedItem().toString(), 3));
              else
                  filters.set(1, RowFilter.regexFilter(comboBox_1.getSelectedItem().toString(), 3));
              // Apply filters
              sorter.setRowFilter(RowFilter.andFilter(filters));           
          }
      });
      

      【讨论】:

      • 天哪,这正是我所需要的,非常感谢!
      猜你喜欢
      • 2012-05-21
      • 2015-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多