Java JFrame在while循环中工作不正常

Java JFrame在while循环中工作不正常,java,swing,Java,Swing,当我试着运行这个程序时,我总是得到一个无法关闭的空帧,我必须从eclipse终止程序。我相当肯定这个问题是while循环的结果(大约代码块的2/3),但我还没有找到解决这个问题的方法 public Draw() { super( "Uno"); JMenuBar bar = new JMenuBar(); // create menu bar JMenu gameMenu = new JMenu( "Play Game" ); JMenu quitMenu =

当我试着运行这个程序时,我总是得到一个无法关闭的空帧,我必须从eclipse终止程序。我相当肯定这个问题是while循环的结果(大约代码块的2/3),但我还没有找到解决这个问题的方法

public Draw()
{
    super( "Uno");

    JMenuBar bar = new JMenuBar(); // create menu bar
    JMenu gameMenu = new JMenu( "Play Game" );
    JMenu quitMenu = new JMenu( "Quit" ); //Quit Program
    bar.add( gameMenu ); // add Add menu to menu bar
    bar.add( quitMenu ); // add quit button to menu bar
    setJMenuBar( bar ); // set menu bar for this application

    window = new JDesktopPane();
    add(window);

    gameMenu.addMouseListener(
        new MouseListener()
        {
            public void mouseClicked(MouseEvent e)
            {
                Dimension size = window.getSize();
                double height = size.getHeight();
                double width = size.getWidth();
                JInternalFrame frame = new JInternalFrame("Uno", true, true, true, true );


                JFrame input = new JFrame();
                input.setTitle(" ");
                input.setSize(350, 155);
                input.setLayout(new FlowLayout());
                input.setLocationRelativeTo(null);
                input.setVisible(true);
                JLabel label1 = new JLabel("How many total players? (2-10)");
                final JTextField text1 = new JTextField(3);
                JLabel label2 = new JLabel("How many computer players? *");
                final JTextField text2 = new JTextField(3);
                JLabel label3 = new JLabel("* Computer players must be <= total number of players");
                JButton confirm = new JButton("OK");

                label1.setVisible(true);
                label2.setVisible(true);
                label3.setVisible(true);
                text1.setVisible(true);
                text2.setVisible(true);
                confirm.setVisible(true);

                input.add(label1);
                input.add(text1);
                input.add(label2);
                input.add(text2);
                input.add(label3);
                input.add(confirm);

                while(valid == false)
                {
                    confirm.addActionListener(new ActionListener()
                    {
                        public void actionPerformed(ActionEvent e)
                        {
                            String players = text1.getText();
                            String computers = text2.getText();
                            int temp1 = Integer.parseInt(players);
                            System.out.println("Number of players = " + temp1);
                            int temp2 = Integer.parseInt(computers);
                            System.out.println("Number of computers = " + temp2);
                            if (temp1 >= 2 && temp1 <= 10)
                                if (temp2 <= temp1 && temp2 >= 0)
                                    valid = true;

                        } //close actionPerformed
                    }); //close ActionListener
                } //close while loop
           } //close mouseClicked
     } //close mouseListener
} //close Draw
public Draw()
{
超级(“Uno”);
JMenuBar bar=新建JMenuBar();//创建菜单栏
JMenu gameMenu=新JMenu(“玩游戏”);
JMenu quitMenu=新建JMenu(“退出”);//退出程序
添加(游戏菜单);//将添加菜单添加到菜单栏
添加(退出菜单);//将退出按钮添加到菜单栏
setJMenuBar(bar);//设置此应用程序的菜单栏
窗口=新的JDesktopPane();
添加(窗口);
gameMenu.addMouseListener(
新的MouseListener()
{
公共无效mouseClicked(MouseEvent e)
{
维度大小=window.getSize();
双倍高度=size.getHeight();
double width=size.getWidth();
JInternalFrame=newjinternalframe(“Uno”,真,真,真,真);
JFrame输入=新JFrame();
input.setTitle(“”);
输入。设置大小(350155);
input.setLayout(新的FlowLayout());
input.setLocationRelativeTo(空);
input.setVisible(真);
JLabel label1=新JLabel(“总共有多少玩家?(2-10)”;
最终JTextField text1=新的JTextField(3);
JLabel label2=新的JLabel(“有多少台计算机播放器?*”);
最终JTextField text2=新的JTextField(3);

JLabel label3=新的JLabel(“*计算机播放器必须是问题是您没有给事件处理程序任何执行其工作的机会。您的while循环不断创建事件处理程序。但是,
actionPeformed()
方法永远无法调用,因为while循环控制CPU,按钮不会响应任何单击

我建议您学习更多关于事件处理的知识。您需要重新设计代码以获得所需的行为。很可能您需要完全删除while循环,只需创建一个事件处理程序,在单击按钮时执行代码


供日后参考:

一般来说,不需要使用布尔值检查相等性。
=
的结果是bool,但是您正在检查的变量已经是
bool
。因此直接使用它:而不是
while(valid==false)
,您可以在(!valid)
时执行
操作。如果您将
读为“not”“,这其实很有道理


在这种情况下,这一点是没有意义的,因为您需要完全删除while循环。但是,这可能是将来某个时候对您有用的信息。

您希望
valid
的值何时更改?(提示:这是在一个事件处理程序中,因为您已将CPU用于无限while循环,因此永远无法调用它。)我忘了在上面添加valid的声明。在draw之外,我声明了它
private static boolean valid=false;
这就是你的意思吗?我错过了那个细节,但它与真正的问题无关。请看下面我的答案。