2016-12-22 2 views
0

я создал программу, чтобы показать результат НОД (наибольший общий делитель) между 2 целыми числами шаг за шагом не только конечный результат в Java FXJavaFX результат этикетки не показывает цикл

здесь есть класс контроллер для него

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 

, но результат должен быть таким, как это обезьяна сотки в терминале

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

Вы пытались отладить код? – n247s

+0

Прямо сейчас есть слишком много кода, чтобы дать полезный ответ. Создайте [минимальный, полный и проверяемый пример] (http://stackoverflow.com/help/mcve). – n247s

+0

Я пробовал, но без проблем –

ответ

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()); 
+0

tnx man it work –

1

Проблема заключается в том, что логика работает жгуты в события Отправки Тема: (EDT). Asl, пока ваша логика работает, EDT не может обновить экран.

Вам нужно переместить логику в отдельные угрозы, которая вызывает setText() метод в Platform.runLater()

+0

tnx для ур ответить, что это звучит здорово, но у меня нет времени, чтобы найти его плохой поиск, как только у меня будет время –

Смежные вопросы