Eclipse中的基本GUI java程序不断崩溃

时间:2015-04-08 17:48:36

标签: java eclipse swing user-interface crash

我正在尝试制作游戏,并且在所述游戏中,有21根棍子,每个人轮流拿1-4支直到没有棍子,如果你不能再拿棍子你输了。我已成功在eclipse中创建了这个程序,但现在我想添加GUI,所以我必须更改代码。这段代码不完整,但每当我按下Go按钮时,它就会崩溃,这是我的actionListener。我会在文本字段中输入一个数字,然后按go,它就会崩溃。我该如何解决这个问题?

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class Sticks extends JFrame {

JButton Go;
JTextField tf1, tf2;
static JTextField sttf;
JLabel startTake;
static JLabel errorTake;
JLabel uTake;
JLabel compTake;

public Sticks() {
    setLayout(new GridLayout(5, 2, 5, 5));

    startTake = new JLabel("How many sticks do you want to take? (1-4)");
    add(startTake);

    sttf = new JTextField();
    add(sttf);

    errorTake = new JLabel("Hello");
    add(errorTake);

    Go = new JButton("Go");
    add(Go);

    uTake = new JLabel("");
    add(uTake);

    compTake = new JLabel("");
    add(compTake);

    // tf1 = new JTextField();
    // add(tf1);

    // TakeP = new JLabel("One stick taken");
    // add(TakeP);

    event e = new event();
    Go.addActionListener(e);
}

public static class event implements ActionListener {
    public void actionPerformed(ActionEvent e) {

        int numSticks = 21;
        int numToTake = 0;
        int randomNum = 0;

        while (numSticks > 0) {
            try {
                int num = (int) (Double.parseDouble(sttf.getText()));
                int NumSticks = numSticks - num;

                    errorTake.setText("There are: " + numSticks + " left");

                    Robot Rob = new Robot();
                    numToTake = (int)Math.random() * 4 + 1;
                    errorTake.setText("There are: " + numSticks + " left");
                }
             catch (Exception ex) {
                ex.printStackTrace();;errorTake.setText("There is a problem");
            }
        }
    }
}

public static void main(String[] args) {
    Sticks gui = new Sticks();
    gui.setDefaultCloseOperation(EXIT_ON_CLOSE);
    gui.setVisible(true);
    gui.setSize(600, 200);

    gui.setTitle("Nice Game");
}
}

1 个答案:

答案 0 :(得分:0)

每当您点击“开始”按钮时,您的actionPerformed会触发,并且根本不会等待用户输入。这是你的问题。

public static class event implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        //...
                int num = (int) (Double.parseDouble(sttf.getText()));
        //...
    }
}

sttf.getText()总是返回“”,因为sttf为空,程序不会等待用户输入,这与Scanner(System.in)不同。

有意义的是你没有得到任何例外,因为它只是运行并完成游戏而不给用户足够的时间输入任何东西。你确定控制台不打印“仅限数字!”吗?因为我以前从未试图解析过空字符串。


好的,我一直都读错了,抱歉。

每次点击动作时,你的actionListener都会生成一个新游戏,因为你在每次点击时都将numSticks设置为21。展望未来,我认为这不是一个好主意,除非你想在游戏结束前一直采取相同数量的棍棒。同样的事情。如果您在sttf中输入一个值,程序将不会等待您更改它,因为它会继续使用该值,直到您的while循环结束。