Javafx 中多个 TextField 的一个 ChangeListener
One ChangeListener for multiple TextFields in Javafx
我想在我的应用程序中为多个 TextField 使用单个 ChangeListener。
我知道您可以创建一个侦听器对象并将其添加到所有 TextField,然后您可以通过事件键检查哪个 TextField-Object 触发了事件。
使用 lamda 表达式我可以将它用于每个 TextField,不幸的是这不适合我的问题。我使用了所有 TextField 的输入,所以一个 Listener 就足够了。
TextField textField = new TextField();
textField.textProperty().addListener((observable, oldValue, newValue) -> {
System.out.println("textfield changed from " + oldValue + " to " + newValue);
});
正如 Slaw 在他的评论中指出的那样,您可以轻松创建一个 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
被改变了。为了跟踪它,您可以创建自己的内部 class 实现 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));
我想在我的应用程序中为多个 TextField 使用单个 ChangeListener。
我知道您可以创建一个侦听器对象并将其添加到所有 TextField,然后您可以通过事件键检查哪个 TextField-Object 触发了事件。
使用 lamda 表达式我可以将它用于每个 TextField,不幸的是这不适合我的问题。我使用了所有 TextField 的输入,所以一个 Listener 就足够了。
TextField textField = new TextField();
textField.textProperty().addListener((observable, oldValue, newValue) -> {
System.out.println("textfield changed from " + oldValue + " to " + newValue);
});
正如 Slaw 在他的评论中指出的那样,您可以轻松创建一个 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
被改变了。为了跟踪它,您可以创建自己的内部 class 实现 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));