Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Динамический поиск по jComboBox. / 1 сообщений из 1, страница 1 из 1
12.10.2016, 00:25
    #39324924
-Andrusha-
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамический поиск по jComboBox.
Доброго времени суток.
Помогите, пожалуйста, разобраться со следующей проблемой.
На форме есть компонент jComboBox. Он заполнен. Надо в него ручками вписывать текст. После любого нажатия на клавишу, список должен динамически перезаполнятся в зависимости, присутвует ли введенный фрагмент в элементе списка.
Получилось примерно следующее.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
import java.awt.Container;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;
import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.text.JTextComponent;

public class TestFrame extends JFrame {

    JComboBox jComboBox1 = new JComboBox();
    Vector<String> all_CB_Items = new Vector<String>();

    public TestFrame() {
        super("Тестовое окно");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container content = getContentPane();
        content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS));
        jComboBox1.setEditable(true);
        jComboBox1.setAlignmentX(LEFT_ALIGNMENT);
        content.add(jComboBox1);

        populateCB();
        final JTextComponent jtc = (JTextComponent) jComboBox1.getEditor().getEditorComponent();
        KeyListener kl = new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {
                populateCB();
            }

            @Override
            public void keyPressed(KeyEvent e) {
            }

            @Override
            public void keyReleased(KeyEvent e) {
                final String text = jtc.getText();
                for (int i = 0; i < all_CB_Items.size(); i++) {
                    if (!all_CB_Items.get(i).contains(text)) {
                        jComboBox1.removeItem(all_CB_Items.get(i));
                    }
                }
                jComboBox1.showPopup();
            }
        };
        jtc.addKeyListener(kl);

        setPreferredSize(new Dimension(240, 130));
        pack();
        setLocationRelativeTo(null);
        setVisible(true);
    }

    private void populateCB() {
        jComboBox1.removeAllItems();
        jComboBox1.addItem("");
        jComboBox1.addItem("1");
        jComboBox1.addItem("12");
        jComboBox1.addItem("123");
        jComboBox1.addItem("1234");
        jComboBox1.addItem("12345");
        all_CB_Items.removeAllElements();
        all_CB_Items.add("");
        all_CB_Items.add("1");
        all_CB_Items.add("12");
        all_CB_Items.add("123");
        all_CB_Items.add("1234");
        all_CB_Items.add("12345");
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame.setDefaultLookAndFeelDecorated(true);
                new TestFrame();
            }
        });
    }
}



Образец, код которого приведен выше, работает почти правильно. При вводе символа с клавиатуры, программа ищет совпадения среди элементов списка и отсекает лишние. Но.
Ищется только по 1-у символу. Т.е. после каждого нажатия, предыдущее тексового поля списка затирается.

Подскажите, пожалуйста, возможные пути решения.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Динамический поиск по jComboBox. / 1 сообщений из 1, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]