当前位置: 首页 > 知识库问答 >
问题:

从JButton调用方法就是冻结JFrame?

申屠洛华
2023-03-14

我正在为一个班做一个基本的乒乓球游戏。我让Pong工作,启动时有一个GUI显示,不幸的是,我似乎无法从开始按钮启动游戏。我已经在代码上注释了问题所在,并删除了不相关的代码。

 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个答案

姚实
2023-03-14

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

贺懿轩
2023-03-14

Swing是一个单线程框架。

也就是说,对UI的所有交互和修改都将在事件调度线程的上下文中进行。任何阻塞此线程的操作都会阻止它处理重绘请求和用户输入/交互等操作。

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

在Swing中通读并发以了解更多细节。

一个简单的解决方案是使用Swing计时器作为游戏循环。每次它滴答作响时,你都会更新游戏的状态,并在游戏的组件上调用(类似于)repaint

 类似资料:
  • 问题内容: 我正在上一堂基本的Pong游戏。我正在工作Pong,并且在启动时有GUI显示,很遗憾,我似乎无法从JButton开头开始游戏。我已在代码中指出问题所在,并删除了不相关的代码。 有任何想法吗? 问题答案: Swing是一个单线程框架。 也就是说,对UI的所有交互和修改都应在事件调度线程的上下文内进行。阻塞此线程的所有内容都将阻止其处理,尤其是重画请求和用户输入/交互。 我的猜测是正在使用

  • 我有一个简单的聊天客户端,我正试图使用作为界面。我的问题是,使用进行聊天输入/输出后,窗口将冻结并阻塞,直到收到另一条消息。 这段代码被缩短了,但是显示了相关的部分。小部件将在很长一段时间内变得无响应,而被调用之后,直到收到消息才会响应。 当小部件再次响应时,条目字段包含输入的所有数据,但在“冻结”时间内我看不到更改。小部件也是如此。 如果有人能解释一下为什么会这样,或者指出我是否错过了这里使用的

  • 问题内容: 我有一个非常小的.so文件(可在此处找到:https ://docs.google.com/leaf?id=0B4MxFm- ACB3INjhkMjhlNzktYzkxYy00Zjk5LTk0Y2MtZDE2MWQ2MzY1OWUy &hl=zh_CN& authkey =CMrJguwN) 我试图将其加载到RHEL上的Java中,而Java 只是冻结(没有错误或异常)。我在LD_LI

  • 我知道有很多关于这个话题的问题,但我还是找不到一个解决办法。 我有一个应用程序,可以加载和显示图像(就像智能手机上的常规图库应用程序一样) 我加载了背景中的所有图像与协同线-在这个过程的这个阶段没有问题。 当我通知适配器有关数据时就会出现问题。notifyDataSetChanged()调用会冻结UI一段时间。 我们讨论的是相对较大的网格(例如1000+张照片) 其他线程中的几乎所有答案都建议,我

  • 当数据被不可变地借用时,它还会冻结(freeze)。已冻结(frozen)数据无法通过原始对象来修改,直到指向这些数据的所有引用离开作用域为止。 fn main() { let mut _mutable_integer = 7i32; { // 借用 `_mutable_integer` let _large_integer = &_mutable_

  • 我希望在单击时回忆一个JButton的值,即当用户单击一个JButton时,该JButton的值(是一个字母)将写入JLabel。用户将单击多个按钮,因此,需要存储和打印多个值。最后,用户将单击一个按钮,保存所有接收到的JButton值的JLabel将被存储(显然是使用数组)。 这是我的JButton在代码中的样子: 模型。随机字母();是对另一个类的引用,其中“字母”是一个包含16个值的数组。我