将从 JButton 获得的值传递给变量

pass a value obtained from a JButton to a variable

所以我的问题是我正在 java swing 中制作一个非常简单的数字猜谜游戏,我添加了一个 JButton 和一个 JTextField,我想单击按钮以获取我的文本中写入的值字段,然后将其传递给执行操作的 do while 循环,然后我将在 JLabel 中显示它,但我不知道如何操作。我没有 JFrame,因为我要将此 class 发送到具有 JFrame 的 class,因此我将所有内容都添加到 JPanel。 希望我说清楚了,希望得到一些帮助。

代码:

import java.util.Random;
import java.util.Scanner;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class GameDat extends JPanel {
JPanel panel = new JPanel();
FlowLayout layout = new FlowLayout();
Random random = new Random();
JButton enter;
JTextField display;
JLabel result;

int MIN = 1;
int MAX = 50;
int compare = random.nextInt(MAX - MIN + 1) + MIN;
int player;
int guessIt = 0;


public void iniGame(){

    enter = new JButton("Pick a number:");

    panel.setSize(300,300);
    panel.setLayout(layout);
    panel.add(enter);
    panel.add(display);
    panel.add(result);

    enter.addActionListener(new CustomActionListenerEnter());


      do {

     //here should go the value captured from the JTextField instead of a scanner
     player = input nextInt();
     guessIt++;

        if (player > compare)
            //this text should go to the jlabel instead of printing it
            System.out.println("Number is less than " + player);
        else if (player < compare)
            //this text should go to the jlabel instead of printing it
             System.out.println("Number is greater than " + player);
        else 
             //this text should go to the jlabel instead of printing it
             System.out.println(compare + " was my number, it took you " + guessIt + " guesses.");
    } while (player != compare);
}

class CustomActionListenerEnter implements ActionListener{

        public void actionPerformed(ActionEvent e){
            //I wanna pass this value to my do while.
            display.getText();


        }
    }



}

我的主要建议:去掉 while 循环。这个循环适用于线性控制台类型的程序,但这不是事件驱动的 GUI 的工作方式,并且该循环将占用 Swing 事件线程,使您的 GUI 冻结和无用。因此,再次摆脱该循环,而是根据用户的响应和基于该状态的基本行为更改此 class 中变量的状态。因此,在您的 ActionListener 中,从 JTextField 获取文本,通过解析将其转换为 int,检查它是否是一个合适的猜测,并通知用户他们的猜测结果。

其他问题:

  • 您了解上面的 class 创建了 两个 JPanel,其中一个 JPanel 是 class 本身的实例,您没有添加任何内容到,另一个由 panel 变量引用,您 do 添加组件。如果您只打算使用面板变量 JPanel,那么 class 可能不应该扩展 JPanel。
  • ...//here should go the value captured from the JTextField instead of a scannerplayer = input nextInt(); 是怎么回事?摆脱这种非编译代码和无用的代码并使用 JTextField。看起来您正试图将控制台代码硬塞到 GUI 中,但这行不通。
  • 不要使用 System.out.println(...) 或类似的代码进行用户交互,但仅用于临时调试。所有用户交互都应该通过 GUI 本身,最终的生产代码不应该有 printlns。

嗯,最后是这样的,效果不错。谢谢

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    player = Integer.parseInt(jTextField3.getText());
    guessIt++;

        if (player > compare)
           jTextField1.setText("Number is less than " + player);

        else if (player < compare)
            jTextField1.setText("Number is greater than " + player);

        else 
          jTextField1.setText(compare + " was my number, it took you " +
          guessIt + " guesses.");


      }