使用ActionListener等待用户输入

时间:2014-03-03 15:26:38

标签: java actionlistener

用户将输入一个猜测,程序将检查它是否大于或小于随机生成的数字,然后再次循环直到guess ==数字。

gtf(猜测文本字段)是用户输入猜测的地方,而ttf(时间文本字段)是显示用户猜测的次数的地方。

问题是它只是跳过if语句(e.getSource()== gtf),它不等待用户在gtf中输入一个数字。你不能在actionPerformer中检查两次用户操作吗?我可以使用哪些其他解决方案?

import javax.swing.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;

public class Test extends JFrame implements ActionListener{

    private int number, guess;
    private int time=0;
    private int result;
    private JButton btnStart;
    private JTextField ttf, gtf;
    private String msg;


//Constructor

public Test(){

    ttf = new JTextField();
    gtf = new JTextField();

    btnStart = new JButton("Start");
    btnStart.addActionListener(this);
    gtf.addActionListener(this);
    gtf.setEditable(false);    
    ttf.setEditable(false);
    msg = ("Guess a number: ");

    Container c = getContentPane();

    c.setLayout(new BorderLayout());
    c.setLayout(new GridLayout(3, 2));
    c.add(new JLabel("Click to start the test: ", JLabel.RIGHT));
    c.add(btnStart);
    JLabel msglabel = new JLabel(msg, JLabel.RIGHT);
    msglabel.setForeground(Color.red);
    c.add(msglabel);
    c.add(gtf);
    c.add(new JLabel("Number of guesses: ", JLabel.RIGHT));
    c.add(ttf);

    setSize(600, 100);
    setTitle("Test");
    setVisible(true);
    setDefaultCloseOperation(EXIT_ON_CLOSE);

}

public void actionPerformed(ActionEvent e){

    if (e.getSource() == btnStart){

        gtf.setEditable(true);
        btnStart.setEnabled(false);

        Random generator = new Random();
        number = generator.nextInt(99) + 1;

        if (e.getSource() == gtf) {
        String g = gtf.getName();
        guess = Integer.parseInt(g);

        while(time<=9)
            {
                time++;
                ttf.setText(Integer.toString(time));

            if(guess>number)
                {
                   msg = (guess + "is too big. Try again: ");

                }   

           else if(guess<number)
                {
                   msg = (guess + " is too small. Try again: ");
                }   

           else if (guess==number)
           {
               break;
           }
       }


    result = (int) Math.ceil(time/3.0);

More code to print result...

2 个答案:

答案 0 :(得分:2)

  

你不能在actionPerformer中检查两次用户操作吗?

不,Swing是基于事件的,因此只有一个组件可以触发ActionEvent。这意味着您需要放置

if (e.getSource() == gtf) {

if语句的外层检查源组件(将按ENTER键触发)

答案 1 :(得分:0)

根本不需要if (e.getSource() == gtf)语句,因为当用户单击按钮Start时开始检查输入,所以如果您传递此语句if (e.getSource() == btnStart),那么if (e.getSource() == gtf)肯定会失败,所以只需删除它。