Один ChangeListener для нескольких TextFields в Javafx - PullRequest
0 голосов
/ 24 июня 2019

Я хочу использовать один ChangeListener для нескольких TextFields в моем приложении.

Я знаю, что вы можете создать объект слушателя и добавить его ко всем TextFields, а затем вы можете проверить через ключ события, какой TextField-Объект вызвал событие.

С помощью выражения lamda я мог бы использовать это для каждого TextField, к сожалению, это не подходит для моей проблемы.Я использую ввод всех текстовых полей, поэтому достаточно одного прослушивателя.

TextField textField = new TextField();
textField.textProperty().addListener((observable, oldValue, newValue) -> {
    System.out.println("textfield changed from " + oldValue + " to " + newValue);
});

1 Ответ

2 голосов
/ 25 июня 2019

Как указал Слав в своем комментарии, вы можете легко создать один ChangeListener и затем применить его к каждому из ваших TextField узлов.

ChangeListener<String> listener = ((observable, oldValue, newValue) -> {
    System.out.println("TextField changed from " + oldValue + " to " + newValue + "!");
});

Вот полный пример, который вы можете запуститьчтобы увидеть его в действии:

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.util.ArrayList;
import java.util.Arrays;

public class ReusableListenerSample extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        // Simple Interface
        VBox root = new VBox(10);
        root.setAlignment(Pos.CENTER);
        root.setPadding(new Insets(10));

        // Create a ChangeListener that we will apply to multiple TextFields
        ChangeListener<String> listener = ((observable, oldValue, newValue) -> {
            System.out.println("TextField changed from " + oldValue + " to " + newValue + "!");
        });

        // Create some TextFields
        TextField txt1 = new TextField();
        TextField txt2 = new TextField();
        TextField txt3 = new TextField();

        // Now, we can add our preconfigured listener to each of the TextFields
        txt1.textProperty().addListener(listener);
        txt2.textProperty().addListener(listener);
        txt3.textProperty().addListener(listener);

        // Add our TextFields to the scene
        root.getChildren().addAll(txt1, txt2, txt3);

        // Show the stage
        primaryStage.setScene(new Scene(root));
        primaryStage.setTitle("ListViewSample Sample");
        primaryStage.show();

    }
}

Теперь в приведенном выше примере не указано , который TextField был изменен.Чтобы отследить это, вы можете создать свой собственный внутренний класс, который реализует ChangeListener<String> и передать ему TextField (или любые другие данные к нему):

class MyChangeListener implements ChangeListener<String> {

    private final TextField myTextField;

    public MyChangeListener(TextField myTextField) {
        this.myTextField = myTextField;
    }

    @Override
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
        System.out.println(myTextField + " changed from " + oldValue + " to " + newValue + "!");
    }
}

Затем просто добавьте новый экземплярчто MyChangeListener каждому TextField вместо:

txt1.textProperty().addListener(new MyChangeListener(txt1));
...