Java JFrame在while循环中无法正常工作

时间:2016-08-04 20:06:26

标签: 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 = 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

最初,我遇到了一个问题,即它一直无限地将帧绘制在自身之上,因为while循环保持返回false。这个问题是通过从while循环中删除组件并将它们放在它们之前来解决的。现在,当我运行它时,我得到的只有:picture

这个程序的目标是制作一个Uno游戏,但第一步是确定玩家的数量。这是我知道如何做到这一点的唯一方法,这只是我用图形完成的第二个程序,所以我绝不是Java的专家。我会感激任何帮助,因为我已经被困了几天了。

1 个答案:

答案 0 :(得分:0)

问题是你没有给事件处理者任何机会完成他们的工作。您的while循环不断创建事件处理程序。但是,永远不能调用actionPeformed()方法,因为while循环控制了CPU,按钮不会响应任何点击。

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

供将来参考:

通常,不需要使用布尔值检查相等性。 ==的结果是bool,但您检查的变量已经是bool。因此,直接使用它:代替while (valid == false),您可以while (!valid)。如果您将!视为&#34;而不是&#34;,这实际上很有意义。

在这种情况下,这一点没有实际意义,因为你需要完全删除while循环。但是,这对您来说可能是一些有用的信息。

相关问题