У меня есть простой ComboBox
, который я использовал ControlsFX для автоматического заполнения. Это работает отлично, за исключением одного досадного недостатка: когда пользователь использует раскрывающийся список для выбора элемента с помощью мыши, открывается окно автозаполнения, в основном предлагая пользователю соответствующие предложения.
Требуемое поведение для выбора значения с помощью мыши, чтобы полностью закрыть всплывающее окно.
Приведенный ниже код продемонстрирует:
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;
import org.controlsfx.control.textfield.TextFields;
public class AutoCompleteComboBox extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) {
// Simple Interface
VBox root = new VBox(10);
root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(10));
// Create a standard ComboBox
ComboBox<Person> comboBox = new ComboBox<>();
// Sample items
ObservableList<Person> people = FXCollections.observableArrayList();
people.addAll(
new Person("William", 34),
new Person("Ashley", 12),
new Person("Marvin", 63),
new Person("Suresh", 18),
new Person("Jackson", 24)
);
comboBox.setItems(people);
// Add StringConverter
comboBox.setConverter(new StringConverter<Person>() {
@Override
public String toString(Person person) {
return (person == null ? null : person.getName());
}
@Override
public Person fromString(String string) {
for (Person person : comboBox.getItems()) {
if (person.getName().equalsIgnoreCase(string)) {
return person;
}
}
return null;
}
});
// Make the ComboBox autocomplete using ControlsFX
comboBox.setEditable(true);
TextFields.bindAutoCompletion(comboBox.getEditor(), comboBox.getItems());
root.getChildren().add(comboBox);
// Show the stage
primaryStage.setScene(new Scene(root));
primaryStage.setTitle("Sample");
primaryStage.show();
}
}
class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return name;
}
}
Так что ввод в редактор и выбор значения с клавиатуры работают нормально. Но если щелкнуть стрелку, чтобы открыть раскрывающийся список и выбрать значение таким образом, вы увидите проблему (по сути, это заставляет пользователя выбирать значение дважды).
Как бы я go запретил это поведение?