Проблема с полем со списком с возможностью поиска в Java SwingJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Проблема с полем со списком с возможностью поиска в Java Swing

Сообщение Anonymous »

Я создал поле со списком с возможностью поиска для использования в программе Java Swing.
Вот как я хотел бы, чтобы оно работало:
  • При нажатии открывается список параметров и можно вводить текст в поле, чтобы пользователь мог искать параметры, используя поиск по нескольким словам.
  • Когда во время поиска обнаруживаются параметры, пользователь может нажать на любой из параметры, и он устанавливает поле со списком для этого элемента. Если параметры не найдены, список пуст.
  • Когда пользователь щелкает за пределами поля со списком, ввод в поле теперь отключен, а список параметров скрыт. Если во время поиска выбор не был сделан, в поле со списком устанавливается значение, выбранное последним, или значение по умолчанию, если выбор не был сделан.
Вот проблема: когда пользователь вводит поисковый запрос и есть доступные параметры, и он щелкает за пределами поля со списком, поле со списком (и текст внутри) устанавливается на параметр по умолчанию (или последний выбранный). Это то, чего я хочу. Но если при поиске не найдено никаких параметров и пользователь щелкает за пределами поля со списком, текст внутри не меняется.
Вот код:

Код: Выделить всё

CustomClass[] items = customClassList.toArray(new CustomClass[customClassList.size()]);
comboBox = new JComboBox(items);
selectedMenuItem = comboBox.getItemAt(0);
currentCustomClassID = selectedMenuItem.getCustomClassID();

Dimension comboBoxSize = comboBox.getPreferredSize();
comboBoxSize.height = 25;
comboBoxSize.width = 500;
comboBox.setMinimumSize(comboBoxSize);
comboBox.setMaximumSize(comboBoxSize);
comboBox.setPreferredSize(comboBoxSize);

comboBox.addActionListener(e -> {
Object selected = comboBox.getSelectedItem();
if (selected instanceof CustomClass) {
selectedMenuItem = (CustomClass) selected;
comboBox.setEditable(false);
currentCustomClassID = selectedMenuItem.getCustomClassID();
}
});
JTextField editor = (JTextField) comboBox.getEditor().getEditorComponent();
menuPane.add(comboBox);

comboBox.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
comboBox.setEditable(true);

});

comboBox.addPopupMenuListener(new PopupMenuListener() {
@Override
public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
// Popup is opening
}

@Override
public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {

}

// This is where the text inside the box should change when the user clicks outside the combo box. It changes when there are options available, but not if the options list is empty
@Override
public void popupMenuCanceled(PopupMenuEvent e) {
comboBox.setEditable(false);
editor.setText(selectedMenuItem.toString());
comboBox.setSelectedItem(selectedMenuItem);
}
});

editor.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
comboBox.setEditable(true);
editor.setText("");
comboBox.showPopup();
}
});

editor.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
String text = editor.getText();
String[] keywords = text.toLowerCase().split(" ");

// Filter items that contain all keywords
Vector filteredItems = new Vector();
for (CustomClass item : items) {
boolean match = true;
for (String keyword : keywords) {
if (!item.toString().toLowerCase().contains(keyword)) {
match = false;
break;
}
}
if (match) filteredItems.add(item);
}

// Update Model
DefaultComboBoxModel newModel = new DefaultComboBoxModel(filteredItems);
comboBox.setModel(newModel);
comboBox.setSelectedItem(text);
comboBox.showPopup();
}
});
Почему строка editor.setText(selectedMenuItem.toString()); работает только тогда, когда есть доступные параметры, а не когда при поиске параметры не найдены?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»