我最近启动了JavaFX,并且正在为学校编写的程序有一个小问题。整个项目已经完成,除了我无法弄清的错误和我所关心的问题。目的是要有一个小盒子,检查是否可以正确解决加法问题,并可以提供新问题。
我遇到的错误是这个(我认为问题出在我的“新建”按钮的处理程序中,但找不到一个。):出现最初的问题后,数字开始相同。如图所示,它可能会开始:7 + 2但结果将是:1 + 1、2 + 2、3 + 3等。
我的另一个问题是:假设有两个Button,是否需要多个Handler,或者是否有办法将其组合成一个? (我尚未在此环境中正式学习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);
}
}
感谢您的帮助。
您的rngInt
函数每次调用都会创建一个新的Random
对象。由于您始终使用new Date().getTime()
进行播种,并且该函数仅具有毫秒精度,因此,如果在同一毫秒内两次调用它(这对计算机来说是很长的时间),那么您将获得相同的数字序列(或者只是两次)。要解决此问题,只需创建一个Random
对象,然后在其上重复nextInt
调用即可,而不是为每次调用都创建一个新的Random
对象。