Java 在单击按钮时再次运行程序?
因此,当dialogResult为0(yes选项)时,我需要程序重新生成一个新的随机数(Zahl)。我认为重新启动该计划将是实现这一目标的一种方式。我尝试使用System.exit(0)关闭JFrame,然后将可见性设置为true(f.setVisible(true))。那没用,画面也没再出现。我还尝试了SwingUtilities.updateComponentTreeUI(f);,f、 重新验证();和f.repaint(),都不起作用 是否有其他方法“重新加载”JFrame,或者只生成一个新的随机数更好 提前谢谢Java 在单击按钮时再次运行程序?,java,swing,jframe,reload,Java,Swing,Jframe,Reload,因此,当dialogResult为0(yes选项)时,我需要程序重新生成一个新的随机数(Zahl)。我认为重新启动该计划将是实现这一目标的一种方式。我尝试使用System.exit(0)关闭JFrame,然后将可见性设置为true(f.setVisible(true))。那没用,画面也没再出现。我还尝试了SwingUtilities.updateComponentTreeUI(f);,f、 重新验证();和f.repaint(),都不起作用 是否有其他方法“重新加载”JFrame,或者只生成一个
import javax.swing.*;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.util.Random;
public class Zahlenraten{
static int i = 0;
public static void main(String[] args) {
JFrame f = new JFrame("Zahlenraten");
f.setSize(500,500);
//f.setLayout(null);
JTextField t = new JTextField("");
t.setBounds(95,10,150,30);
f.addWindowFocusListener(new WindowAdapter() {
public void windowGainedFocus(WindowEvent e) {
t.requestFocusInWindow();
}
});
JButton e = new JButton("Exit");
e.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
e.setBounds(300, 100, 100, 30);
JLabel txt = new JLabel("Zahl eingeben:");
txt.setBounds(10,10,150,30);
Random r = new Random();
int Zahl = r.nextInt(100-0+1);
JButton b = new JButton("Prüfen");
f.getRootPane().setDefaultButton(b);//Enter Key = button b
b.addActionListener(evt -> { //statt evt könnte man natürlich auch actionPerformed... nehmen.
i++;
String str = t.getText();
int wert = Integer.parseInt(str);
t.setText("");
if(wert > Zahl) {
System.out.println("Der gesuchte Wert ist kleiner.");
}
if(wert < Zahl) {
System.out.println("Der gesuchte Wert ist größer.");
}
if(wert == Zahl) {
System.out.println("Der gesuchte Wert wurde gefunden! Du hast "+i+" Versuche gebraucht.");
int dialogResult = JOptionPane.showConfirmDialog(null, "Wollen Sie noch eine Runde spielen?","Frage",JOptionPane.YES_NO_OPTION);
if(dialogResult==0) {
}else {
System.exit(0);
}
}
});
b.setBounds(10,100,100,30);
JPanel p = new JPanel();
p.setLayout(null);
p.add(b);
p.add(e);
p.add(t);
p.add(txt);
f.add(p);
f.setVisible(true);
}
}
import javax.swing.*;
导入java.awt.event.ActionListener;
导入java.awt.event.WindowAdapter;
导入java.awt.event.WindowEvent;
导入java.awt.Toolkit;
导入java.awt.event.ActionEvent;
导入java.util.Random;
公共类Zahlenraten{
静态int i=0;
公共静态void main(字符串[]args){
JFrame f=新JFrame(“Zahlenraten”);
f、 设置大小(500500);
//f、 setLayout(空);
JTextField t=新的JTextField(“”);
t、 立根数(95,10150,30);
f、 addWindowFocusListener(新的WindowAdapter(){
公共无效windowGainedFocus(WindowEvent e){
t、 requestFocusInWindow();
}
});
JButton e=新JButton(“退出”);
e、 addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
系统出口(0);
}
});
e、 立根(30010010030);
JLabel txt=新的JLabel(“Zahl-eingeben:”);
txt.setBounds(10,10150,30);
随机r=新随机();
int-Zahl=r.nextInt(100-0+1);
JButton b=新JButton(“Prüfen”);
f、 getRootPane().setDefaultButton(b);//输入键=按钮b
b、 addActionListener(evt->{//statt evt könnte man natürlich auch actionPerformed…内曼。
i++;
String str=t.getText();
int-wert=Integer.parseInt(str);
t、 setText(“”);
如果(wert>Zahl){
System.out.println(“Der gesuchte Wert ist kleiner.”);
}
如果(wert
目前,当你想倒车时,你的方法就像关闭汽车发动机一样——这种方法显然是不必要的,因为你可以在不重新启动汽车的情况下换档
您需要将逻辑和UI分为两个单独的类。将UI视为远程控件,将包含逻辑的类视为执行从UI接收的命令的引擎。UI类创建引擎类的实例
engine类运行一个游戏循环,该循环将继续运行,直到您告诉它停止为止,因此在编程术语中,您的程序具有以下状态:游戏正在进行中,或者游戏未进行中
boolean imGange = true;
boolean ratenFalsch = true;
while(imGange)
{
// generate random number
while(ratenFalsch)
{
// ask for a guess
// if the guess is correct
// print message: right
ratenFalsch = false;
// if the guess is incorrect
// print message: wrong
}
// ask user to play again
// if no
imGange = false; // game will end, but the program will still be running
}
在构建UI之前,确保引擎正常运行,并且可以通过控制台玩游戏。当游戏正常运行时,您必须将UI中的按钮映射到引擎中的方法。例如,您的UI有一个按钮“Neu-Spiel”,它从引擎调用相应的方法,例如,mainLoop()
,其中我上面概述的所有逻辑都包含在名为mainLoop
的方法中
以这种方式组织代码意味着只要UI在运行,引擎就在运行。使用主循环意味着您可以随时启动一个新游戏,而无需停止和启动UI,并且您将在每场游戏中获得一个新的随机数。目前,你的方法就像在你想倒车的时候关掉汽车引擎——这种方法显然是不必要的,因为你可以在不重启汽车的情况下换挡 您需要将逻辑和UI分为两个单独的类。将UI视为远程控件,将包含逻辑的类视为执行从UI接收的命令的引擎。UI类创建引擎类的实例 engine类运行一个游戏循环,该循环将继续运行,直到您告诉它停止为止,因此在编程术语中,您的程序具有以下状态:游戏正在进行中,或者游戏未进行中
boolean imGange = true;
boolean ratenFalsch = true;
while(imGange)
{
// generate random number
while(ratenFalsch)
{
// ask for a guess
// if the guess is correct
// print message: right
ratenFalsch = false;
// if the guess is incorrect
// print message: wrong
}
// ask user to play again
// if no
imGange = false; // game will end, but the program will still be running
}
在构建UI之前,确保引擎正常运行,并且可以通过控制台玩游戏。当游戏正常运行时,您必须将UI中的按钮映射到引擎中的方法。例如,您的UI有一个按钮“Neu-Spiel”,它从引擎调用相应的方法,例如,mainLoop()
,其中我上面概述的所有逻辑都包含在名为mainLoop
的方法中
以这种方式组织代码意味着只要UI在运行,引擎就在运行