如何为ControlsFX CustomTextField自动完成下拉列表设置OnClick或OnSelection?

时间:2017-11-28 20:44:05

标签: java javafx controlsfx

我正在使用ControlsFX's CustomTextField。当我点击其中一个自动填充选项时,我需要清除TextField并创建Tag,以便我可以将其添加到FlowPane。如何设置OnClickOnSelectionChange听众或覆盖当前的OnClick

enter image description here

1 个答案:

答案 0 :(得分:4)

我看了一下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上设置一个监听器(因为我们无法使用鼠标从自动完成列表中选择一个)并以某种方式确定用户是否实际使用自动完成列表触发事件。因此,我有一个标志,用于查找用户输入(例如按键)和每次释放键时“释放”标志。我们还必须捕获粘贴操作,以便在用户在字段上粘贴文本时避免错误。最后一件事是我们清理这个领域的方式。我们必须将标志设置为false,因为field.clear()也会触发事件,我们不想陷入事件循环。

注意:使用当前的解决方法,您将看到您也可以通过按Enter键从自动完成列表中进行选择。