Java按钮处理

Java按钮处理,java,eclipse,javafx,event-handling,Java,Eclipse,Javafx,Event Handling,我的任务是做一个叫“猜数字”的游戏。用户猜测一个介于1和1000之间的数字,单击“确定”,然后收到一条消息,说明该数字是否正确、过高或过低。我的问题是事件处理。当我按下“OK”键时,程序就会崩溃。我做错了什么 package application; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.sce

我的任务是做一个叫“猜数字”的游戏。用户猜测一个介于1和1000之间的数字,单击“确定”,然后收到一条消息,说明该数字是否正确、过高或过低。我的问题是事件处理。当我按下“OK”键时,程序就会崩溃。我做错了什么

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.GridPane;
import javafx.stage.Stage;

public class GjettTalletSpill extends Application implements EventHandler<ActionEvent> {

Button ok;
Label text;
Label message;
TextField TF;

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


}// Main.

@Override
public void start(Stage primaryStage) throws Exception {
    primaryStage.setTitle("Gjett tallet spill");

    ok = new Button("OK");
    ok.setOnAction(this);
    ok.setPrefSize(100,20);
    text = new Label("Guess a number between 1 and 1000: ");
    TF = new TextField();
    message = new Label("");

    GridPane gp = new GridPane();

    gp.add(text,1,1);
    gp.add(TF,3,1);
    gp.add(message,2,2);
    gp.add(ok,2,3);

    Scene scene = new Scene(gp,600,150);
    primaryStage.setScene(scene);
    primaryStage.show();

}


@Override 
public void handle(ActionEvent event) {

    int uGuessed;
    int theNumber;

    tallet = 1 + (int)(Math.random() * 1000); 
    uGuessed = Integer.parseInt(TF.getText());

    while (uGuessed != theNumber){

        if (uGuessed<theNumber){
            message.setText("The number was too low. Try again!");
        } else {
            message.setText("The number was too high. Try again!");

        }// if/else.
    }// while.

    message.setText("Congratulations! You guessed the roght number! :D");
}// ActionEvent.

}// Class.
包应用;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.Label;
导入javafx.scene.control.TextField;
导入javafx.scene.layout.GridPane;
导入javafx.stage.stage;
公共类GjettalletSpill扩展应用程序实现EventHandler{
按钮ok;
标签文本;
标签信息;
TextField;
公共静态void main(字符串[]args){
发射(args);
}//梅因。
@凌驾
public void start(Stage primaryStage)引发异常{
初级阶段。设置标题(“Gjett-tallet溢漏”);
ok=新按钮(“ok”);
好的,设定动作(这个);
ok.setPrefSize(100,20);
text=新标签(“猜一个介于1和1000之间的数字:”);
TF=新文本字段();
消息=新标签(“”);
GridPane gp=新的GridPane();
添加总成(文本,1,1);
gp.add(TF,3,1);
总成添加(消息,2,2);
总成添加(确定,2,3);
场景=新场景(gp,600150);
初级阶段。场景(场景);
primaryStage.show();
}
@凌驾
公共无效句柄(ActionEvent事件){
内敛;
整数;
tallet=1+(int)(Math.random()*1000);
uGuessed=Integer.parseInt(TF.getText());
while(uGuessed!=编号){

如果(uGuessed当然你的程序冻结了。当你按下按钮时,你的程序调用handle函数,并且永远不会返回(除非你在第一次尝试时输入了正确的数字)。因此你的程序在处理事件时卡住了,例如,不再调用repaint方法

只需删除while循环。记住,每次按ok按钮时都会调用句柄方法。因此不要在句柄方法中生成随机数。移动

private int theNumber;
    @Override
    public void start(Stage primaryStage) throws Exception {
        theNumber = 1 + (int) (Math.random() * 1000);
在启动方法的基础上,在启动应用程序后生成一个随机数

并替换动作处理程序,使其只检查一次该数字,更新消息标签,然后返回

@Override
    public void handle(ActionEvent event) {
        int uGuessed;
        uGuessed = Integer.parseInt(TF.getText());

        if (uGuessed < theNumber) {
            message.setText("The number was too low. Try again!");
        } else if (uGuessed > theNumber) {
            message.setText("The number was too high. Try again!");
        } else {
            message.setText("Congratulations! You guessed the roght number! :D");
        } // ActionEvent.
    }
@覆盖
公共无效句柄(ActionEvent事件){
内敛;
uGuessed=Integer.parseInt(TF.getText());
如果(uguesed<编号){
message.setText(“数字太低,请重试!”);
}否则,如果(uGuessed>编号){
message.setText(“数字太高,请重试!”);
}否则{
message.setText(“祝贺您!您猜对了roght号码!:D”);
}//ActionEvent。
}

您的程序应该可以运行:).

您遇到了什么异常?请将其发布到“什么是
塔莱”
?此外,尽管循环毫无意义……但您从未更改循环体内部条件中的任何值。没有异常出现。它只是冻结。您的程序似乎更可能进入无休止的循环并冻结,而不是实际cra她。你明白区别吗?“塔莱”是数字。我刚把它翻译成英文,忘了那个。非常好的观点,费边!非常感谢!救了我一命:D