您如何通过Java FX中的多个事件处理程序执行一项操作?

时间:2018-11-06 23:39:46

标签: java javafx

我正在尝试制作一个平方公式。它可以在命令提示符下运行,但是我希望它可以在表单上运行,并在每次更改输入时更新输出。 This is my form so far.您可以更改多个区域,即组合框和文本字段,但是我希望所有这些区域都更新标签以显示输出。这是我的问题所在。我不知道该如何使用类似于更新标签的方法。下面是该代码的简化版本:

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class SmallForm extends Application{

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        GridPane grid = new GridPane();
        grid.setVgap(5);

        Label lblConcatenated = new Label("");//label that will hold the concatenated string
        grid.add(lblConcatenated, 0, 0);

        TextField txtA = new TextField("");//Text field one
        grid.add(txtA, 0, 1);

        TextField txtB = new TextField("");//Text field two
        grid.add(txtB, 0, 2);

        txtA.textProperty().addListener(new ChangeListener<String>() { //Triggers whenever the second text field is changed
            @Override public void changed(ObservableValue ov, String t, String t1) {
               lblConcatenated.setText(txtA.getText() + txtB.getText());//Concatenates the text in the two text fields
            }
        });

        txtB.textProperty().addListener(new ChangeListener<String>() {
            @Override public void changed(ObservableValue ov, String t, String t1) { //Triggers whenever the second text field is changed
                lblConcatenated.setText(txtA.getText() + txtB.getText());//Concatenates the text in the two text fields
            }
        });

        Scene scene = new Scene(grid, 250, 100);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

我的目标是使连接行仅需写入一次。重复更多的代码,这将更加普遍。在命令提示符下,可以使用一种方法轻松完成此操作,但是据我所知,这在java fx中不起作用。我曾经听说过“线程”这个词,但是我无法弄清楚。

谢谢!

1 个答案:

答案 0 :(得分:1)

您当然可以使用一种方法。您也可以为两个属性使用相同的ChangeListener<String>对象。

在这种情况下,我建议使用绑定:

lblConcatenated.textProperty().bind(txtA.textProperty().concat(txtB.textProperty()));

如果您需要解析值并根据解析后的值进行更新,建议您使用TextFormatter

StringConverter<Double> converter = new DoubleStringConverter();
TextFormatter<Double> formatterA = new TextFormatter<>(converter, 0d);
TextFormatter<Double> formatterB = new TextFormatter<>(converter, 0d);
txtA.setTextFormatter(formatterA);
txtB.setTextFormatter(formatterB);

formatterA.valueProperty()...

TextField失去焦点或触发onAction的{​​{1}}事件时,格式器值将更新。