如何为 ControlsFX CustomTextField 自动完成下拉菜单设置 OnClick 或 OnSelection?
How to set OnClick or OnSelection for ControlsFX CustomTextField autocomplete dropdown?
我正在使用 ControlsFX's
CustomTextField
. When I click on one of the autocomplete options, I need to clear the TextField
and create a ,所以我可以将它添加到 FlowPane
。如何设置 OnClick
或 OnSelectionChange
侦听器或覆盖当前 OnClick
?
我查看了 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 上设置一个侦听器(因为我们不能在使用鼠标从自动完成列表中选择时设置一个)并以某种方式查明用户是否真的使用自动完成列表触发了事件。因此,我有一个标志来寻找用户输入(例如按键)和 'releasing' 每次释放按键时的标志。我们还必须捕获粘贴操作,以避免用户在字段上粘贴文本时出错。最后一件事是我们清理场地的方式。我们必须将标志设置为 false,因为 field.clear() 也会触发一个事件,我们不想陷入事件循环。
注意:使用当前的解决方法,您将看到您也可以通过按回车键从自动完成列表中进行选择。
我正在使用 ControlsFX's
CustomTextField
. When I click on one of the autocomplete options, I need to clear the TextField
and create a FlowPane
。如何设置 OnClick
或 OnSelectionChange
侦听器或覆盖当前 OnClick
?
我查看了 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 上设置一个侦听器(因为我们不能在使用鼠标从自动完成列表中选择时设置一个)并以某种方式查明用户是否真的使用自动完成列表触发了事件。因此,我有一个标志来寻找用户输入(例如按键)和 'releasing' 每次释放按键时的标志。我们还必须捕获粘贴操作,以避免用户在字段上粘贴文本时出错。最后一件事是我们清理场地的方式。我们必须将标志设置为 false,因为 field.clear() 也会触发一个事件,我们不想陷入事件循环。
注意:使用当前的解决方法,您将看到您也可以通过按回车键从自动完成列表中进行选择。