JavaFX такой же номер? - PullRequest
0 голосов
/ 04 мая 2020

Я недавно запустил JavaFX, и у меня возникла небольшая проблема с программой, над которой я работаю в школе. Весь проект завершен, кроме ошибки, которую я не могу выяснить, и беспокойства, которое у меня есть. Цель состоит в том, чтобы иметь маленькую рамку, которая проверяет, правильно ли решена проблема сложения, и может предоставить новые проблемы.

У меня есть ошибка (я думаю, что проблема в моем обработчике для New Кнопка, но не может найти.): После первоначальной проблемы, цифры начинают быть одинаковыми. Например, это может начаться: 7 + 2, но затем приведет к: 1 + 1, 2 + 2, 3 + 3 и т. Д. c ..

Другой вопрос, который у меня есть, таков: две кнопки, для этого требуется более одного обработчика или есть способ уместить его в одну? (Я еще не изучал Lambda в этой среде)

Вот код:

package application;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import java.util.Random;

import java.util.Date;

public class MathDrill extends Application
{
    private Button checkButton, newButton;
    private Label topNumLabel, botNumLabel, reply;
    private TextField input;


    //Check
    class BCHCheck implements EventHandler<ActionEvent>
    {
        @Override
        public void handle(ActionEvent event)
        {
            Integer answer;

            try
            {
                answer = Integer.parseInt(input.getText());

                Integer topNum = Integer.parseInt(topNumLabel.getText()),
                        botNum = Integer.parseInt(botNumLabel.getText());

                if(topNum + botNum == answer)
                {
                    reply.setText("Correct!");
                }
                else
                {
                    reply.setText("Incorrect!");
                }
            }
            catch(NumberFormatException e)
            {
                reply.setText("Try again with an integer please.");
            }               
        }
    }

    //New
    class BCHNew implements EventHandler<ActionEvent>
    {
        @Override
        public void handle(ActionEvent event)
        {
            topNumLabel.setText(Integer.toString(rngInt()));

            botNumLabel.setText(Integer.toString(rngInt()));

            reply.setText("");
        }
    }

    public static void main(String[] argv)
    {
        launch(argv);
    }

    public void start(Stage stage)
    {
        topNumLabel = new Label(Integer.toString(rngInt()));
        botNumLabel = new Label(Integer.toString(rngInt()));
        reply = new Label("");

        Label words = new Label("Solve this:"),
               plus = new Label("+"),
           equalBar = new Label("-----");

        input = new TextField();


        GridPane problem = new GridPane();
        problem.add(words, 0, 0);
        problem.add(plus, 0, 4);

        problem.add(topNumLabel,1, 1);
        problem.add(botNumLabel, 1, 2);
        problem.add(equalBar, 1, 3);
        problem.add(input, 1, 4);
        problem.add(reply, 1, 5);

        checkButton = new Button("Check");
        checkButton.setOnAction(new BCHCheck());

        checkButton.setMinSize(100, 100);

        newButton = new Button("New");
        newButton.setOnAction(new BCHNew());

        newButton.setMinSize(100, 100);

        GridPane buttons = new GridPane();
        buttons.add(checkButton, 0, 0);
        buttons.add(newButton, 0, 1);


        BorderPane bp = new BorderPane();

        bp.setLeft(buttons);
        bp.setCenter(problem);

        Scene scene = new Scene(bp);



        stage.setTitle("Math Drills");
        stage.setScene(scene);
        stage.setMinWidth(350);
        stage.show();
    }

    /**
     * Returns rng int value from 0-9
     * 
     * @return  rng int, [0, 9]
     */
    private int rngInt()
    {
         return new Random(new Date().getTime()).nextInt(10);
    }
}

Спасибо за помощь.

1 Ответ

0 голосов
/ 04 мая 2020

Ваша rngInt функция создает новый Random объект каждый раз, когда вы вызываете его. Так как вы всегда заполняете его с new Date().getTime(), и эта функция имеет точность только в миллисекундах, если вы вызовете ее дважды в одну и ту же миллисекунду (что долго для компьютера), вы получите ту же последовательность чисел (или просто один номер в вашем случае) оба раза. Чтобы исправить это, сделайте только один Random объект и просто повторите для него вызов nextInt вместо создания нового Random объекта для каждого вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...