小编典典

从JButton调用方法是否冻结了JFrame?

java

我正在上一堂基本的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();          
           }
         }); 
         }

有任何想法吗?


阅读 252

收藏
2020-11-30

共1个答案

小编典典

Swing是一个单线程框架。

也就是说,对UI的所有交互和修改都应在事件调度线程的上下文内进行。阻塞此线程的所有内容都将阻止其处理,尤其是重画请求和用户输入/交互。

我的猜测是playGame正在使用类似Thread.sleep或类似的东西while(true)并且阻止了EDT,导致您的程序看起来像被冻结了一样

阅读Swing中的并发以了解更多详细信息。

一个简单的解决方案是使用SwingTimer充当游戏循环。每次打勾时,您都将更新游戏状态并调用(类似)repaint游戏组件

2020-11-30