Фильтр jcombobox в java -Внешний вид и ощущение независимости

У меня есть простой код фильтра 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 array;

    public FilterComboBox(List 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 filterArray= new ArrayList();
        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 populateArray() {
        List test = new ArrayList();
        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();
    }
}

Производительность комбинированного фильтра не так хороша, но подходит для небольшого количества наборов данных. Моя проблема -, когда я удаляю комментарий UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");, чтобы изменить внешний вид, фильтр не работает. В WindowsLookAndFeel поле со списком принимает в нем только один символ, заменяя ранее введенный символ.

Different Outputs after typing 'moun'

Не могли бы вы рассказать мне, что происходит? Ответ Маноджа Шреста ниже в какой-то мере помогает, но не могли бы вы предоставить другие предложения для создания фильтра поля со списком в Java?

12
задан 17 revs 23 May 2017 в 12:19
поделиться