AutoComplete ComboBox с ControlsFX запускает автозаполнение при выборе значения мышью - PullRequest
2 голосов
/ 19 февраля 2020

У меня есть простой 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 запретил это поведение?

...