我正在使用ControlsFX's
CustomTextField
。当我点击其中一个自动填充选项时,我需要清除TextField
并创建Tag
,以便我可以将其添加到FlowPane
。如何设置OnClick
或OnSelectionChange
听众或覆盖当前的OnClick
?
答案 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键从自动完成列表中进行选择。