我正在尝试制作一个平方公式。它可以在命令提示符下运行,但是我希望它可以在表单上运行,并在每次更改输入时更新输出。 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中不起作用。我曾经听说过“线程”这个词,但是我无法弄清楚。
谢谢!
答案 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}}事件时,格式器值将更新。