将从 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 scanner
和 player = 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.");
}
所以我的问题是我正在 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 scanner
和player = 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.");
}