从JButton调用方法会冻结JFrame?

时间:2014-05-07 03:46:24

标签: java swing jframe jbutton event-dispatch-thread

我正在为一堂课做一个基本的Pong游戏。我有Pong工作,我在启动时有一个GUI显示,不幸的是我似乎无法从JButton开始游戏。我已经评论了问题在代码上的位置,并删除了不相关的代码。

 frame.add(GUIPanel);
        JButton startButton = new JButton("Start!");     
        GUIPanel.add(startButton, BorderLayout.CENTER);
        startButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
         { 
             frame.getContentPane().remove(GUIPanel);
             frame.validate();
             frame.repaint();

             drawPanel = new DrawPanel();
             drawPanel.requestFocus();
             frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
              //This is the part that freezes it, everything else works fine
              //except that the playGame method isn't called. If I remove the whole
              //startButton and whatnot I can call playGame and it works perfectly.                                                                                    
              playGame();          
           }
         }); 
         }

任何想法?

2 个答案:

答案 0 :(得分:4)

Swing是一个单线程框架。

也就是说,UI的所有交互和修改都是在Event Dispatching Thread的上下文中进行的。任何阻止此线程的东西都会阻止它处理重绘请求和用户输入/交互等。

我的猜测playGame正在使用类似Thread.sleep或某种while(true)的内容并阻止了EDT,导致您的程序看起来好像被冻结了

详细阅读Concurrency in Swing

一个简单的解决方案是使用Swing Timer作为游戏循环。每次滴答时,您都会更新游戏状态并在游戏组件上调用repaint

答案 1 :(得分:0)

看起来你的括号不属于你的倒数第二个分号。尝试删除它。