Java 使用wait()动态更改组件背景色

Java 使用wait()动态更改组件背景色,java,swing,colors,background,jpanel,Java,Swing,Colors,Background,Jpanel,我正在尝试做一个有趣的JFrame,所以当鼠标离开窗口时,它会将面板的Background颜色更改为一些随机颜色(以引起用户注意): 问题是背景颜色不会改变。。。它在窗口标题中显示cont的值,但颜色不变。如果我删除循环,只需在面板内外移动鼠标,它就会改变。。。但我想让它,当鼠标离开窗口,它不断地改变颜色自动,直到鼠标回到它。某种癫痫(?) 我不知道为什么如果我循环它并使用wait()进行延迟,它不工作。Swing是一个单线程框架,这意味着任何阻止事件调度线程的操作都会阻止它处理事件队列(包括重

我正在尝试做一个有趣的
JFrame
,所以当鼠标离开窗口时,它会将面板的
Background
颜色更改为一些随机颜色(以引起用户注意):

问题是背景颜色不会改变。。。它在窗口标题中显示cont的值,但颜色不变。如果我删除循环,只需在面板内外移动鼠标,它就会改变。。。但我想让它,当鼠标离开窗口,它不断地改变颜色自动,直到鼠标回到它。某种癫痫(?)


我不知道为什么如果我循环它并使用
wait()
进行延迟,它不工作。

Swing是一个单线程框架,这意味着任何阻止事件调度线程的操作都会阻止它处理事件队列(包括重绘请求),并导致应用程序显示为挂起,因为它已经挂起

决不能在EDT上下文中执行长时间运行或阻塞操作

相反,在这种情况下,您应该使用Swing
计时器来安排常规回调。这样做的好处是回调是在EDT的上下文中执行的,因此可以安全地用于更新UI(因为Swing也不是线程安全的)


查看并获取更多详细信息

您正在阻止事件调度线程,以防止无法更新UI。您是否阅读了
wait()
的文档?这可能根本不是你想用的。谢谢!是 啊我从.NET切换到java。。。我想我不能像C一样使用
async void
wait Task.Delay(int)
。。。但是谢谢!我只是用定时器测试了一下,然后开始工作:)非常感谢你:P
    wnd.addMouseListener(new MouseAdapter(){
         @Override
        public synchronized void mouseExited(MouseEvent e){
            cond = true;
            while(cond){
                try{
                    wnd.getContentPane().setBackground(Color.getHSBColor((cont+=0.05), 1, 1));
                    wnd.setTitle("Num: "+cont);
                    wnd.getContentPane().repaint(); //With or without it doesn't work either
                    wait(100);
                    }
                    catch(InterruptedException ex){ Thread.currentThread().interrupt(); }
                }
            }
    });
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private Timer updateTimer;

        public TestPane() {
            updateTimer = new Timer(100, new ActionListener() {
                private float cont = 0;

                @Override
                public void actionPerformed(ActionEvent e) {
                    setBackground(Color.getHSBColor((cont += 0.05), 1, 1));
                }
            });

            addMouseListener(new MouseAdapter() {

                @Override
                public void mouseExited(MouseEvent e) {
                    updateTimer.start();
                }

                @Override
                public void mouseEntered(MouseEvent e) {
                    updateTimer.stop();
                }

            });
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }

    }

}