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