Вот как я хотел бы, чтобы оно работало:
- При нажатии открывается список параметров и можно вводить текст в поле, чтобы пользователь мог искать параметры, используя поиск по нескольким словам.
- Когда во время поиска обнаруживаются параметры, пользователь может нажать на любой из параметры, и он устанавливает поле со списком для этого элемента. Если параметры не найдены, список пуст.
- Когда пользователь щелкает за пределами поля со списком, ввод в поле теперь отключен, а список параметров скрыт. Если во время поиска выбор не был сделан, в поле со списком устанавливается значение, выбранное последним, или значение по умолчанию, если выбор не был сделан.
Вот код:
Код: Выделить всё
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();
}
});
Мобильная версия