Как установить OnClick или OnSelection для выпадающего списка ControlsFX CustomTextField autocomplete?


Я использую ControlsFX's CustomTextField. Когда я нажимаю на один из вариантов автозаполнения, мне нужно очистить TextField и создать Tag так что я могу добавить его к FlowPane. Как настроить прослушиватель OnClick или OnSelectionChange или переопределить текущий OnClick?

Введите описание изображения здесь

1 2

1 ответ:

Я взглянул на документацию CustomTextField и не могу найти четкого способа сделать то, что вы хотите. Поэтому я буду предполагать , что вы должны реализовать его самостоятельно или найти обходной путь. В случае, если вы решите выбрать второй вариант, вот то, что, по моему мнению, работает очень хорошо:

import java.util.ArrayList;

import org.controlsfx.control.textfield.CustomTextField;
import org.controlsfx.control.textfield.TextFields;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TestApplication extends Application {

    private boolean addedBySelection = false;
    private ArrayList<String> tagList = new ArrayList<>();
    private FlowPane tagPane;

    @Override
    public void start(Stage primaryStage) throws Exception {

        VBox mainPane = new VBox(10);
        mainPane.setStyle("-fx-background-color : white");
        mainPane.setPadding(new Insets(15));
        mainPane.setAlignment(Pos.CENTER);

        tagPane = new FlowPane(15, 10);
        tagPane.setPrefHeight(50);

        CustomTextField field = new CustomTextField() {
            @Override
            public void paste() {
                super.paste();
                addedBySelection = false;
            }
        };

        field.setOnKeyPressed(e -> {
            addedBySelection = false;
        });

        field.setOnKeyReleased(e -> {
            addedBySelection = true;
        });

        field.textProperty().addListener(e -> {
            if (addedBySelection) {
                System.out.println("Text Changed from the suggession list ");
                addTag(field.getText());

                addedBySelection = false;
                field.clear();
                addedBySelection = true;
            } else {
                System.out.println("User Input (Mouse paste, or typing) ");
            }
        });

        TextFields.bindAutoCompletion(field, new String[] { "Java", "C++", "C#", "Python", "Haskell" });

        mainPane.getChildren().addAll(field, tagPane);

        Scene scene = new Scene(mainPane, 200, 100);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void addTag(String tag) {
        if (!tagList.contains(tag)) {
            tagList.add(tag);
            Label tagLabel = new Label(tag);
            tagLabel.setStyle("-fx-background-color : #E1ECF4; -fx-text-fill : #6A739D;");
            tagPane.getChildren().add(tagLabel);
        }
    }

    public static void main(String[] args) {
        launch(args);
    }

}

Я старался, чтобы это было как можно проще. Приведенный выше код делает именно то, что вам нужно. Логика заключается в том, чтобы установить прослушиватель на свойство textProperty ( потому что мы не можем установить его на выделение с помощью мыши из списка автозаполнения) и каким-то образом выяснить, действительно ли пользователь запускает событие с помощью списка автозаполнения или нет. Таким образом, у меня есть флаг, который ищет входные данные пользователя (ex. нажатие клавиши) и "отпускание" флага при каждом отпускании клавиш. Мы должны поймать действие вставки, а также для того, чтобы избежать ошибок, если пользователь вставляет текст на поле. Еще одна последняя вещь-это то, как мы очищаем поле. Мы должны установить наш флаг на false, потому что поле.clear() вызовет событие как ну и мы не хотим попасть в петлю событий.

Примечание : с текущим обходным путем вы увидите, что вы можете сделать выбор из списка автозаполнения, нажав клавишу enter, а также.