javafx标签不显示循环结果

时间:2016-12-22 20:12:11

标签: java javafx label

我创建了一个程序来逐步显示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

所以我说为什么标签只显示循环的最终结果而不是整个循环就像终端显示它

2 个答案:

答案 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());