Java JComboBox过滤器

Java JComboBox过滤器,java,swing,autocomplete,filtering,jcombobox,Java,Swing,Autocomplete,Filtering,Jcombobox,我有一个JComboBox,它有可编辑属性true。 我想知道我是否有一个列表添加到JComboBox中,是否可能 例如,我将新字符串[]{“a”、“a1”、“b”、“c”、“a3”}添加到具有可编辑true属性的JComboBox中。当我在JComboBox上输入a时,将返回新字符串[]{“a”、“a1”、“a3”}的列表 这可能吗 提前感谢。最简单的方法是使用,然后弹出列表返回筛选的项目以下是您需要做的事情。 创建一个arrayList或List并将所有项目添加到其中。 创建combobox

我有一个JComboBox,它有可编辑属性
true
。 我想知道我是否有一个
列表
添加到JComboBox中,是否可能

例如,我将
新字符串[]{“a”、“a1”、“b”、“c”、“a3”}
添加到具有可编辑
true
属性的JComboBox中。当我在JComboBox上输入
a
时,将返回
新字符串[]{“a”、“a1”、“a3”}
的列表

这可能吗


提前感谢。

最简单的方法是使用,然后弹出列表返回筛选的项目

以下是您需要做的事情。 创建一个arrayList或List并将所有项目添加到其中。 创建combobox并循环所有项目,然后将其添加到combobox 然后创建一个过滤器方法。 这不是一个完美的答案,但它会让你走

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);
            }
        }

}
公共类过滤器ComboxText{
私有JFrame;
私有最终JComboBox组合框=新JComboBox();
私有静态ListForComboBox=new ArrayList();
/**
*启动应用程序。
*/
公共静态void main(字符串[]args){
invokeLater(新的Runnable(){
公开募捐{
试一试{
FilterComboxText窗口=新建FilterComboxText();
window.frame.setVisible(true);
}捕获(例外e){
e、 printStackTrace();
}
}
});
listForComboBox.add(“Lion”);
listForComboBox.add(“LionKing”);
listForComboBox.add(“Mufasa”);
listForComboBox.add(“Nala”);
listForComboBox.add(“KingNala”);
listForComboBox.add(“动物”);
添加(“动画”);
listForComboBox。添加(“鱼”);
添加(“水母”);
添加(“我是老板”);
}
公共过滤器ComboxText(){
初始化();
}
私有void初始化(){
frame=新的JFrame();
框架.立根(100100412165);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
comboBox.setEditable(真);
comboBox.addItemListener(新的ItemListener(){
公共无效itemStateChanged(ItemEvent arg0){
}
});
for(字符串详细信息:listForComboBox){
comboBox.addItem(详细信息);
}
最终的JTextField textfield=(JTextField)组合框。getEditor().getEditorComponent();
addKeyListener(新的KeyAdapter(){
公开无效密钥已释放(密钥事件){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
如果(!textfield.getText().isEmpty()){
comboBoxFilter(textfield.getText());
}
}
});
}
});
组合框.立根(10,39,364,29);
frame.getContentPane().add(组合框);
}
public void ComboxFilter(字符串输入文本){
System.out.println(comboBox.getItemCount());
如果(!comboBox.isPopupVisible()){
comboBox.showPopup();
}
List filterArray=new ArrayList();
对于(int i=0;i0){
DefaultComboxModel=(DefaultComboxModel)comboBox.getModel();
model.removeAllElements();
模型.附录(“”);
用于(字符串s:filterArray)
模型.附录;
JTextField textfield=(JTextField)comboBox.getEditor().getEditorComponent();
textfield.setText(enteredText);
}
}
}

当然这个选项有很多变体,但我建议不要使用,我同意,这段代码已经正确地实现了所有侦听器、其事件和通知程序,问题是我在哪里可以看到它的短编码版本?我忘了有非常好的替代方案SwingX已经为一堆JComponents实现了decorator,我理解,关于问题
短编码版本
我认为不可能将一堆重要方法打包到“压缩版本”