Java 如何循环回到程序的开头

Java 如何循环回到程序的开头,java,swing,while-loop,actionlistener,Java,Swing,While Loop,Actionlistener,我正在尝试使用此条件创建一个while循环。(a>1)基本上如此。每次a设置为大于1时,它将关闭我创建的JFrame,然后重新启动程序。我的问题是,当我尝试在动作侦听器中编辑整数“a”时,它无法识别它已经被声明。这实际上有点难以描述,所以这里是我的代码 public class TestBox { public static void main(String[] args) { int a = 2; while(a > 1){

我正在尝试使用此条件创建一个while循环。(a>1)基本上如此。每次a设置为大于1时,它将关闭我创建的JFrame,然后重新启动程序。我的问题是,当我尝试在动作侦听器中编辑整数“a”时,它无法识别它已经被声明。这实际上有点难以描述,所以这里是我的代码

    public class TestBox {
    public static void main(String[] args) {
        int a = 2;
            while(a > 1){
                a = 0;
                JFrame frame = new JFrame("Test Box");
                frame.setSize(1200, 800);
                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
                frame.setResizable(true);
                frame.setLayout(new GridLayout(6, 6, 1, 1));
                JPanel panelAOne = new JPanel();
                JPanel panelATwo = new JPanel();
                JPanel emptySpace = new JPanel();
                JLabel labelAOne = new JLabel();
                labelAOne.setFont(new Font("Aerial", Font.ITALIC, 21));
                labelAOne.setText("Welcome to the Test Box!");
                JLabel labelATwo = new JLabel();
                labelATwo.setFont(new Font("Aerial", Font.ITALIC, 21));
                labelATwo.setText("Where would you like to go?");
                JLabel emptyLabel = new JLabel("stuff goes here");
                JButton buttonAOne = new JButton("Colors");
                panelAOne.add(labelAOne);
                panelAOne.add(labelATwo);
                panelATwo.add(buttonAOne);
                emptySpace.add(emptyLabel);
                frame.add(panelAOne);
                frame.add(buttonAOne);
                frame.add(emptySpace);
                frame.setVisible(true);
                buttonAOne.addActionListener(new ActionListener() {
                    public void actionPerformed(ActionEvent e) {
                        a = 2;
                //If this code is left as is, a GUI will open endlessly until it crashes the computer
            }
            }
        });
    }    
}

您似乎试图将线性控制台程序转换为Swing事件驱动GUI程序,或者反之亦然,但您确实不想这样做,我建议您重新构建程序。相反,显示GUI,获取输入,如果输入错误,则在GUI中重新请求输入。在循环执行此操作时,不要使用控制台类型的程序

因此,例如,如果ActionListener发现输入无效,则通过调用JTextField上的
setText(“”
),清除JTextField中的文本,向用户显示一个JopOptions窗格,通知他们输入中的错误,并等待再次按下按钮。但要让JFrame保持显示状态


编辑:我甚至在您的代码中没有看到JTextField,因此我不确定用户应该在哪里输入。

您似乎试图将线性控制台程序转换为Swing事件驱动GUI程序,或者将其转换为visa,但您确实不想这样做,我建议您重新构建您的程序。相反,显示GUI,获取输入,如果输入错误,则在GUI中重新请求输入。在循环执行此操作时,不要使用控制台类型的程序

因此,例如,如果ActionListener发现输入无效,则通过调用JTextField上的
setText(“”
),清除JTextField中的文本,向用户显示一个JopOptions窗格,通知他们输入中的错误,并等待再次按下按钮。但要让JFrame保持显示状态


编辑:我甚至在您的代码中没有看到JTextField,所以我不确定用户应该在哪里输入。

您的方案无法工作,至少不可靠。在循环的第一次迭代结束时,局部变量
a
仍然在循环的顶部设置了值(
0
),因此循环退出,应用程序的主线程终止。GUI将继续运行,因为它是在一个单独的线程(AWT的事件调度线程(EDT))中运行的,但是即使您重新编写了代码,以便
ActionListener
可以修改变量
a
的模拟,到那时仍然没有人会在意。(可能吧。您有多个线程共享数据,但没有任何同步,因此您的程序的行为实际上没有得到很好的定义。)


正如满是鳗鱼的气垫船所指出的,GUI编程与控制台编程有着根本的不同。从一个到另一个需要进行重大的心理调整,但GUI编程的基本范式是,程序所做的一切都是对事件的响应。因此,如果您想要某种重新生成行为,那么您应该通过为适当的事件注册侦听器并让它执行您想要的工作来获得它。

您的方案无法工作,至少不可靠。在循环的第一次迭代结束时,局部变量
a
仍然在循环的顶部设置了值(
0
),因此循环退出,应用程序的主线程终止。GUI将继续运行,因为它是在一个单独的线程(AWT的事件调度线程(EDT))中运行的,但是即使您重新编写了代码,以便
ActionListener
可以修改变量
a
的模拟,到那时仍然没有人会在意。(可能吧。您有多个线程共享数据,但没有任何同步,因此您的程序的行为实际上没有得到很好的定义。)


正如满是鳗鱼的气垫船所指出的,GUI编程与控制台编程有着根本的不同。从一个到另一个需要进行重大的心理调整,但GUI编程的基本范式是,程序所做的一切都是对事件的响应。因此,如果您想要某种重新生成行为,那么您应该通过为适当的事件注册一个侦听器并让它执行您想要的工作来获得它。

将a定义为字段而不是变量。也就是说,将声明上移到main()定义的上方。将a定义为字段而不是变量。也就是说,将声明上移到main()定义上方。