Как установить OnClick или OnSelection для выпадающего списка ControlsFX CustomTextField autocomplete?
Я использую ControlsFX's
CustomTextField
. Когда я нажимаю на один из вариантов автозаполнения, мне нужно очистить TextField
и создать Tag
так что я могу добавить его к FlowPane
. Как настроить прослушиватель OnClick
или OnSelectionChange
или переопределить текущий OnClick
?
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, а также.