gpt4 book ai didi

java - 如何为 ControlsFX CustomTextField 自动完成下拉菜单设置 OnClick 或 OnSelection?

转载 作者:行者123 更新时间:2023-11-30 06:46:26 25 4
gpt4 key购买 nike

我正在使用 ControlsFX 的 CustomTextField .当我点击其中一个自动完成选项时,我需要清除 TextField 并创建一个 Tag所以我可以将它添加到 FlowPane。如何设置 OnClickOnSelectionChange 监听器或覆盖当前的 OnClick

enter image description here

最佳答案

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

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

关于java - 如何为 ControlsFX CustomTextField 自动完成下拉菜单设置 OnClick 或 OnSelection?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47540624/

25 4 0