我创建了一个程序来逐步显示2个整数之间的gcd(最大公共分隔符)的结果,而不仅仅是java fx中的最终结果
这是它的控制器类
package sample;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Alert;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;
import javafx.stage.Stage;
import javafx.event.ActionEvent;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
public class Controller implements Initializable {
int q, r1, r2, r3, r4, r;
private Main main;
private Stage primaryStage;
public void setMain(Main main, Stage primaryStage) {
this.main = main;
this.primaryStage = primaryStage;
}
@FXML
private Label label;
@FXML
private TextFlow tf;
@FXML
private TextArea ta;
@FXML
private Text t;
@FXML
private TextField field;
@FXML
private TextField field1;
@FXML
private void handleButtonAction(ActionEvent event) {
String t1 = field.getText();
String t2 = field1.getText();
if (t1.isEmpty() || t2.isEmpty()) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setTitle("Warning");
alert.setHeaderText("Enter Values");
alert.setContentText("you have to enter Integer Numbers");
alert.showAndWait();
} else {
try {
r1 = Integer.parseInt(t1);
r2 = Integer.parseInt(t2);
if (r1 < r2) {
r3 = r2;
r4 = r1;
r = r3 % r4;
q = r3 / r4;
String t = ("r1=" + r3 + " " + "r2=" + r4 + " " + "q=" + q + " " + "r=" + r);
String t6 = new String();
while (r != 0) {
r3 = r4;
r4 = r;
r = r3 % r4;
q = r3 / r4;
t6 = "r1=" + r3 + " " + "r2=" + r4 + " " + "q=" + q + " " + "r=" + r;
System.out.println(t6);
}
String t7 = ("gcd=" + r4);
label.setText(t + "\n" + t6 + "\n" + t7 + "\n");
label.setWrapText(true);
} else {
r = r1 % r2;
q = r1 / r2;
String t3 = ("r1=" + r1 + " " + "r2=" + r2 + " " + "q=" + q + " " + "r=" + r);
String t4 = new String();
//this part of code
while (r != 0) {
r1 = r2;
r2 = r;
r = r1 % r2;
q = r1 / r2;
t4 = ("r1=" + r1 + " " + "r2=" + r2 + " " + "q=" + q + " " + "r=" + r);
}
String t5 = ("gcd=" + r2);
label.setText(t3 + "\n" + t4 + "\n" + t5 + "\n");
}
} catch (Exception e) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setTitle("Warning");
alert.setHeaderText("Values Error");
alert.setContentText("you can only enter Integer Numbers");
alert.showAndWait();
}
field.clear();
field1.clear();
}
}
public void close(){
primaryStage.close();
}
@Override
public void initialize(URL url, ResourceBundle rb){}
public void changeWindow(){
main.secondWindow();
}
}
现在这是我输入例如26 15时的结果 这是结果
r1=26 r2=15 q=1 r=11
r1=3 r2=1 q=3 r=0
gcd=1
但结果应该是这样的,就像它在终端中的apear一样
r1=26 r2=15 q=1 r=11
r1=15 r2=11 q=1 r=4
r1=11 r2=4 q=2 r=3
r1=4 r2=3 q=1 r=1
r1=3 r2=1 q=3 r=0
1
所以我说为什么标签只显示循环的最终结果而不是整个循环就像终端显示它
答案 0 :(得分:1)
问题是您的逻辑是使用事件调度线程(EDT)运行的。只要您的逻辑运行,EDT就无法更新屏幕。
您需要将您的逻辑移动到一个单独的威胁中,该威胁在setText()
Platform.runLater()
方法
答案 1 :(得分:1)
如果要包含Label
中的每个步骤,则需要为每个循环迭代的最终结果添加一些内容。你不做这样的事情。为此,我建议使用StringBuilder
:
if (r1 > r2) {
int t = r1;
r1 = r2;
r2 = t;
}
StringBuilder sb = new StringBuilder();
while (r1 > 0) {
int temp = r2 % r1;
sb.append("r1=").append(r2).append(" r2=").append(r1).append(" q=").append(r2/r1).append(" r=").append(temp).append('\n');
r2 = r1;
r1 = temp;
}
sb.append("gcd=").append(r2);
label.setText(sb.toString());