java - java 中的 jcombobox 过滤器 - 外观独立

标签 java swing jcombobox runtime-error look-and-feel

我有一个像这样的简单 JComboBox 过滤器代码:

import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

public class FilterComboBox extends JComboBox {
    private List<String> array;

    public FilterComboBox(List<String> array) {
        super(array.toArray());
        this.array = array;
        this.setEditable(true);
        final JTextField textfield = (JTextField) this.getEditor().getEditorComponent();
        textfield.addKeyListener(new KeyAdapter() {
            public void keyReleased(KeyEvent ke) {
                SwingUtilities.invokeLater(new Runnable() {
                    public void run() {
                        comboFilter(textfield.getText());
                    }
                });
            }
        });

    }

    public void comboFilter(String enteredText) {
        List<String> filterArray= new ArrayList<String>();
        for (int i = 0; i < array.size(); i++) {
            if (array.get(i).toLowerCase().contains(enteredText.toLowerCase())) {
                filterArray.add(array.get(i));
            }
        }
        if (filterArray.size() > 0) {
            this.setModel(new DefaultComboBoxModel(filterArray.toArray()));
            this.setSelectedItem(enteredText);
            this.showPopup();
        }
        else {
            this.hidePopup();
        }
    }

    /* Testing Codes */
    public static List<String> populateArray() {
        List<String> test = new ArrayList<String>();
        test.add("");
        test.add("Mountain Flight");
        test.add("Mount Climbing");
        test.add("Trekking");
        test.add("Rafting");
        test.add("Jungle Safari");
        test.add("Bungie Jumping");
        test.add("Para Gliding");
        return test;
    }

    public static void makeUI() {
        JFrame frame = new JFrame("Adventure in Nepal - Combo Filter Test");
        FilterComboBox acb = new FilterComboBox(populateArray());
        frame.getContentPane().add(acb);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

    public static void main(String[] args) throws Exception {

        //UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        makeUI();
    }
}

combo filter 的性能不是很好,但是对于少数数据集来说还可以。我的问题是 - 当我删除注释 UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); 以更改外观时,过滤器不起作用。在 WindowsLookAndFeel 中,组合框仅通过替换先前输入的字符来获取其中的单个字符。

Different Outputs after typing 'moun'

你能告诉我发生了什么事吗? Manoj Shrestha's answer below在某种程度上有所帮助,但是,您能否提供一些其他建议以在 Java 中实现组合框过滤器?

最佳答案

首先,您每次都在创建新模型,然后从导致闪烁等的代码中调用显示弹出窗口。我们可以修改模型本身。其次,您将当前输入的文本设置为所选项目,这似乎具有其他人指出的 selectAll 行为。我修改了代码如下:

public void comboFilter(String enteredText) {
    if (!this.isPopupVisible()) {
        this.showPopup();
    }

    List<String> filterArray= new ArrayList<String>();
    for (int i = 0; i < array.size(); i++) {
        if (array.get(i).toLowerCase().contains(enteredText.toLowerCase())) {
            filterArray.add(array.get(i));
        }
    }
    if (filterArray.size() > 0) {
        DefaultComboBoxModel model = (DefaultComboBoxModel) this.getModel();
        model.removeAllElements();
        for (String s: filterArray)
            model.addElement(s);

        JTextField textfield = (JTextField) this.getEditor().getEditorComponent();
        textfield.setText(enteredText);
    }
}

希望它对你有用。

关于java - java 中的 jcombobox 过滤器 - 外观独立,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10368856/

相关文章:

java - 在二维数组上移动数据

java - JSTL - 使用 forEach 迭代用户定义的类

java - 将背景图像添加到包含其他组件的面板

java - 无法从SwingWorker类获取JProgressBar进行更新

java - 刷新 JComboBox

java - 如何解决计数器不平衡和重叠方法的算法?

Java:system.out.println 连接字符串中的内容(非常简单的问题)

java - 为什么我的线程在 Swing 中不能正常工作?

java - 动态 JComboBox

java - 过滤 JComboBox