import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import java.util.regex.Pattern;
public class Main extends Application {
double a;
int k=5;
String str;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
TextField textField1 = new TextField("");
TextField textField2 = new TextField("");
TextField textField3 = new TextField("");
Text t1 = new Text("高度(m) = ");
Text t2 = new Text("下落时间(s) = ");
Text t3 = new Text("保留小数位(默认5) = ");
//文本框里的灰色提示
textField1.setPromptText("请输入高度");
textField2.setPromptText("请输入时长");
textField3.setPromptText("结果保留小数位数");
//设置焦点
textField1.setFocusTraversable(false);
textField2.setFocusTraversable(false);
textField3.setFocusTraversable(false);
//网格布局
GridPane gridPane = new GridPane();
gridPane.add(t1,0,0);
gridPane.add(textField1,1,0);
gridPane.add(t2,0,1);
gridPane.add(textField2,1,1);
gridPane.add(t3,0,2);
gridPane.add(textField3,1,2);
//布局对齐
gridPane.setAlignment(Pos.TOP_CENTER);
//布局的内边距
gridPane.setPadding(new Insets(10,10,10,0));
//场景
Scene scene = new Scene(gridPane);
//组件的外边距
GridPane.setMargin(t1,new Insets(10));
GridPane.setMargin(t2,new Insets(10));
GridPane.setMargin(t3,new Insets(10));
//调整组件对齐
GridPane.setHalignment(t1, HPos.RIGHT);
GridPane.setHalignment(t2, HPos.RIGHT);
GridPane.setHalignment(t3, HPos.RIGHT);
//添加监听
//监听内容变化
textField1.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
if(textField1.isFocused()){
//过滤出数字
str = Pattern.compile("[^0-9]").matcher(newValue).replaceAll("");
//啥都不填 a=0
if(str.equals("")) { textField2.clear(); a = 0;}
//正常情况
else {
a = Double.parseDouble(str);
textField2.setText(String.valueOf(String.format("%." + k + "f", Math.pow(2 * a / 9.8, 0.5))));
}
}
}
});
textField2.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
if(textField2.isFocused()) {
str = Pattern.compile("[^0-9]").matcher(newValue).replaceAll("");
if (str.equals("")) { textField1.clear(); a = 0;}
else {
a = Double.parseDouble(str);
textField1.setText(String.valueOf(String.format("%." + k + "f", 0.5 * 9.8 * Math.pow(a, 2))));
}
}
}
});
textField3.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
str = Pattern.compile("[^0-9]").matcher(newValue).replaceAll("");
if(str.equals("")) { k=5; }
else if(!textField2.getText().isEmpty()) {
k = Integer.parseInt(str);
}
textField2.setText(String.valueOf(String.format("%." + k + "f", Math.pow(2 * a / 9.8, 0.5))));
}
});
primaryStage.setTitle("计算自由落体");
primaryStage.setScene(scene);
primaryStage.setHeight(200);
primaryStage.setWidth(400);
primaryStage.show();
}
}
效果:
修改一个bug后的版本:
package Demo1;
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import java.util.regex.Pattern;
public class Main extends Application {
double a;
int k=5;
int which=1;//改哪个框里的内容
String str;
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
TextField textField1 = new TextField("");
TextField textField2 = new TextField("");
TextField textField3 = new TextField("");
Text t1 = new Text("高度(m) = ");
Text t2 = new Text("下落时间(s) = ");
Text t3 = new Text("保留小数位(默认5) = ");
//文本框里的灰色提示
textField1.setPromptText("请输入高度");
textField2.setPromptText("请输入时长");
textField3.setPromptText("结果保留小数位数");
//设置焦点
textField1.setFocusTraversable(false);
textField2.setFocusTraversable(false);
textField3.setFocusTraversable(false);
//网格布局
GridPane gridPane = new GridPane();
gridPane.add(t1,0,0);
gridPane.add(textField1,1,0);
gridPane.add(t2,0,1);
gridPane.add(textField2,1,1);
gridPane.add(t3,0,2);
gridPane.add(textField3,1,2);
//布局对齐
gridPane.setAlignment(Pos.TOP_CENTER);
//布局的内边距
gridPane.setPadding(new Insets(10,10,10,0));
//场景
Scene scene = new Scene(gridPane);
//组件的外边距
GridPane.setMargin(t1,new Insets(10));
GridPane.setMargin(t2,new Insets(10));
GridPane.setMargin(t3,new Insets(10));
//调整组件对齐
GridPane.setHalignment(t1, HPos.RIGHT);
GridPane.setHalignment(t2, HPos.RIGHT);
GridPane.setHalignment(t3, HPos.RIGHT);
//添加监听
//监听内容变化
textField1.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
if(textField1.isFocused()){
//过滤出数字
str = Pattern.compile("[^0-9]").matcher(newValue).replaceAll("");
//啥都不填 a=0
if(str.equals("")) { textField2.clear(); a = 0;}
//正常情况
else {
a = Double.parseDouble(str);
textField2.setText(String.valueOf(String.format("%." + k + "f", Math.pow(2 * a / 9.8, 0.5))));
}
which = 2;
}
}
});
textField2.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
if(textField2.isFocused()) {
str = Pattern.compile("[^0-9]").matcher(newValue).replaceAll("");
if (str.equals("")) { textField1.clear(); a = 0;}
else {
a = Double.parseDouble(str);
textField1.setText(String.valueOf(String.format("%." + k + "f", 0.5 * 9.8 * Math.pow(a, 2))));
}
which = 1;
}
}
});
textField3.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
str = Pattern.compile("[^0-9]").matcher(newValue).replaceAll("");
if(str.equals("")) { k=5; }
else if(!textField2.getText().isEmpty()) {
k = Integer.parseInt(str);
}
if(which == 2)
textField2.setText(String.valueOf(String.format("%." + k + "f", Math.pow(2 * a / 9.8, 0.5))));
else
textField1.setText(String.valueOf(String.format("%." + k + "f", Math.pow(2 * a / 9.8, 0.5))));
}
});
primaryStage.setTitle("计算自由落体");
primaryStage.setScene(scene);
primaryStage.setHeight(200);
primaryStage.setWidth(400);
primaryStage.show();
}
}
bug是修改"保留小数位数"时没判断焦点而引起的。因为要判断的焦点是在焦点落到textField3前一次的焦点,比较繁琐,于是增加了一个其它的判断条件。