【问题标题】:JComboBox FilterJComboBox 过滤器
【发布时间】:2012-05-21 15:57:09
【问题描述】:

我有这个具有可编辑属性true 的 JComboBox。 我想知道是否可以将List<String> 添加到 JComboBox 过滤中?

例如,我将new String[] {"a", "a1", "b", "c", "a3"} 添加到具有可编辑true 属性的JComboBox 中。当我在 JComboBox 上输入a 时,将返回new String[] {"a", "a1", "a3"} 的列表。

这可能吗?

提前致谢。

【问题讨论】:

    标签: java swing autocomplete filtering jcombobox


    【解决方案1】:

    这是您需要做的。 创建一个 arrayList 或 List 并在那里添加所有项目。 创建组合框并循环所有项目并将其添加到组合框 然后创建一个过滤方法。 这不是一个完美的答案,但它会让你继续前进。

    public class FilterComboBoxText {
    
        private JFrame frame;
        private final JComboBox comboBox = new JComboBox();
        private static List<String>listForComboBox= new ArrayList<String>();
    
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        FilterComboBoxText window = new FilterComboBoxText();
                        window.frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
    
            listForComboBox.add("Lion");
            listForComboBox.add("LionKing");
            listForComboBox.add("Mufasa");
            listForComboBox.add("Nala");
            listForComboBox.add("KingNala");
            listForComboBox.add("Animals");
            listForComboBox.add("Anims");
            listForComboBox.add("Fish");
            listForComboBox.add("Jelly Fish");
            listForComboBox.add("I am the boss");
    
    
        }
    
        public FilterComboBoxText() {
            initialize();
        }
    
        private void initialize() {
            frame = new JFrame();
            frame.setBounds(100, 100, 412, 165);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.getContentPane().setLayout(null);
            comboBox.setEditable(true);
    
            comboBox.addItemListener(new ItemListener() {
                public void itemStateChanged(ItemEvent arg0) {
    
                }
            });
    
            for(String detail : listForComboBox) {
                comboBox.addItem(detail); 
            }
            final JTextField textfield = (JTextField) comboBox.getEditor().getEditorComponent();
            textfield.addKeyListener(new KeyAdapter() {
                public void keyReleased(KeyEvent ke) {
                    SwingUtilities.invokeLater(new Runnable() {
                        public void run() {
                            if(!textfield.getText().isEmpty()){
                                comboBoxFilter(textfield.getText());
                            }
                        }
                    });
    
                }
            });
            comboBox.setBounds(10, 39, 364, 29);
            frame.getContentPane().add(comboBox);
        }
         public void comboBoxFilter(String enteredText) {
             System.out.println(comboBox.getItemCount());
    
                if (!comboBox.isPopupVisible()) {
                    comboBox.showPopup();
                }
    
                List<String> filterArray= new ArrayList<String>();
                for (int i = 0; i < listForComboBox.size(); i++) {
                    if (listForComboBox.get(i).toLowerCase().contains(enteredText.toLowerCase())) {
                        filterArray.add(listForComboBox.get(i));
                    }
                }
                if (filterArray.size() > 0) {
                    DefaultComboBoxModel<String> model = (DefaultComboBoxModel<String>) comboBox.getModel();
                    model.removeAllElements();
                    model.addElement("");
                    for (String s: filterArray)
                        model.addElement(s);
    
                    JTextField textfield = (JTextField) comboBox.getEditor().getEditorComponent();
                    textfield.setText(enteredText);
                }
            }
    
    }
    

    【讨论】:

      【解决方案2】:

      最简单的方法是使用AutocComplete JComboBox / JTextField,然后JComboBox'es弹出列表返回过滤的项目

      【讨论】:

      • 肯定有很多关于这个选项的变化,但我建议不要使用它,这个代码已经正确实现了所有的监听器,它的事件和通知器,
      • 我同意,问题是我在哪里可以看到那个短代码版本?
      • 我忘记了 SwingX 已经为一堆 JComponents 实现了非常好的替代装饰器
      • 我明白了,关于问题short-coded version of that 我认为不可能将一堆重要方法打包到“压缩版本”中
      猜你喜欢
      • 2015-02-06
      • 2016-09-08
      • 1970-01-01
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2022-01-08
      相关资源
      最近更新 更多