我正在尝试使用此条件创建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
}
}
});
}
}
答案 0 :(得分:3)
您希望尝试将线性控制台程序转换为Swing事件驱动的GUI程序,反之亦然,您真的不想这样做,我建议您重新构建程序。而是显示您的GUI,获取输入,并在GUI中重新请求输入,如果它是错误的。为此循环时不要使用控制台类型的程序。
因此,例如,如果ActionListener发现输入无效,则通过调用JTextField上的setText("")
清除JTextField中的文本,向用户显示一个JOptionPane,通知他们输入中的错误并等待另一个按下按钮。但请保持显示JFrame。
编辑:我甚至没有在你的代码中看到一个JTextField,所以我不确定用户应该在哪里输入输入。
答案 1 :(得分:3)
您的方案无法运作,至少不可靠。在循环的第一次迭代结束时,局部变量a
仍然在循环顶部设置了值(0
),因此循环退出并且应用程序的主线程死亡。 GUI将继续运行,因为它在一个单独的线程(AWT的事件派发线程(EDT))中运行,但即使您重新编写代码以便可以修改变量a
的模拟通过你的ActionListener
,关心的人仍然会关注这一点。 (可能。你有多个线程在没有任何同步的情况下共享数据,所以你的程序的行为确实没有明确定义。)
GUI编程与控制台编程根本不同,正如Hovercraft Full Of Eels指出的那样。它需要一个重要的心理调整才能从一个移动到另一个,但GUI编程的基本范例是你的程序所做的一切都是对事件的响应。因此,如果您想要某种重新生成行为,那么您应该通过为适当的事件注册一个监听器并让它执行您想要的工作来获得它。