0

因此,当我运行此代码以尝试更改背景时,GUI 崩溃并陷入无限循环,而忽略了事件侦听器。这是代码:

private Panel getPanel1() {
        if (panel1 == null) {
            panel1 = new Panel();
            panel1.setLayout(new GridBagLayout());
            while(frame.isVisible()){
                panel1.addMouseListener(new java.awt.event.MouseAdapter() {
                    public void mouseClicked(java.awt.event.MouseEvent e) {
                        frame.setVisible(false);
                    }
                });
                int r = (int) (Math.random()*255);
                int g = (int) (Math.random()*255);
                int b = (int) (Math.random()*255);
                Color c = new Color(r, g, b);
                panel1.setBackground(c);
                try {
                    Thread.sleep(4000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
                panel1.addMouseListener(new java.awt.event.MouseAdapter() {
                    public void mouseClicked(java.awt.event.MouseEvent e) {
                        /*panel1.setVisible(false);
                        frame.setVisible(false);*/
                        System.exit(0);
                    }
                });
            }
        }
        return panel1;
}

而不是退出终止程序或事件更改背景的循环,它只是显示面板并且什么都不做,我必须强制它退出。我该怎么办?

4

1 回答 1

0

您通过sleep循环调用有效地阻塞了 UI 线程。在那个循环中,您还在每次迭代中添加两个侦听器,这很奇怪。

不要阻塞 UI 线程。让 GUI 框架负责传递事件等。基本上,您需要对 UI 采用基于事件的方法,而不是您当前正在采用的方法,它永远不会让任何事件被发送(因为您永远不会将控制权返回给呼叫者,召集者)。

创建面板,添加适当的事件侦听器,然后将其返回给调用者。如果您想每 4 秒更改一次背景颜色,您应该通过计时器来完成,这样它就不会阻塞等待 4 秒过去的 UI 线程。

于 2009-12-05T19:31:26.113 回答