【问题标题】:Java button eventhandelingJava 按钮事件处理
【发布时间】:2016-04-17 17:44:52
【问题描述】:

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

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.

【问题讨论】:

  • 你遇到了什么异常?请也发布一下
  • 什么是tallet?此外,while 循环根本没有意义......你永远不会改变循环体内条件中的任何值。
  • 没有出现异常。它只是冻结..
  • 您的程序似乎更有可能陷入无限循环并死机,而不是实际崩溃。你明白其中的区别吗?
  • "Tallet" 是数字。我只是把它翻译成英文并忘记了那个。非常好点fabian!

标签: java eclipse javafx event-handling


【解决方案1】:

您的程序当然会冻结。当您按下按钮时,您的程序会调用句柄函数并且永远不会返回(除非您在第一次尝试时输入了正确的数字)。所以你的程序在处理事件时卡住了,e。 G。不会再调用repaint-method了。

只需删除 while 循环。请记住,每次按下确定按钮时都会调用您的句柄方法。所以不要在句柄方法中生成你的随机数。移动

private int theNumber;
    @Override
    public void start(Stage primaryStage) throws Exception {
        theNumber = 1 + (int) (Math.random() * 1000);

在您的启动方法之上,在您启动应用程序后生成一个随机数。

并替换您的 Action 处理程序,使其只检查一次数字,更新消息标签然后返回。

@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.
    }

你的程序应该可以工作:)。

【讨论】:

  • 非常感谢!拯救了我的一天:D
猜你喜欢
  • 1970-01-01
  • 2018-10-12
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多