为什么我的 Thread.sleep() 没有按预期工作?

问题描述 投票:0回答:1

我的代码目前看起来像这样,我想在发布代码发生之后,但在游戏开始之前延迟这个过程,但目前看起来发布代码根本没有发生。看起来好像在延迟之后立即开始,这是我不想要的。如果有人可以帮助,谢谢。 ````

这是我的代码。 (不好意思抱歉)

startButton.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {}
            @Override
            public void mousePressed(MouseEvent e) {
                // Press
                startButton.setPreferredSize(new Dimension(240, 240));
                startButton.setIcon(startButtonHover);
                FRAME.pack();
            }
            @Override
            public void mouseReleased(MouseEvent e) {
                // Release
// NOT TRIGGERING AT ALL
                startButton.setPreferredSize(new Dimension(256, 256));
                startButton.setIcon(startButtonImage);
                FRAME.pack();

                try {
                    Thread.sleep(400);
                } catch (InterruptedException e1) {
                    Thread.currentThread().interrupt();
                }

                // Game Start
                FRAME.remove(menuPanel);
                FRAME.revalidate();
                FRAME.repaint();


java sleep
1个回答
1
投票

几乎所有的 UI 系统,swing(您在这里使用的系统)就是其中之一,都有这个称为事件调度线程或 EDT 的概念。

EDT 有很多特性:

  • 只有一个这样的线程。
  • 与 UI 的任何交互(例如,
    jLabel.setText("Hello")
    、删除或添加小部件、更改某些东西的颜色等等)必须 从 EDT 完成。如果您从任何其他线程执行此操作,就会发生奇怪的事情。
  • 所有事件处理程序(因此,您的鼠标单击代码等)都在 EDT 中运行。
  • 您绝不能阻止 EDT。如果用户将另一个窗口拖过应用程序的窗口,EDT 负责确保您的程序重新绘制自身(操作系统不记得那些像素!操作系统只是要求应用程序重新绘制自身;有时鼠标指针不正确) '一个硬件精灵并在它的身后留下'踪迹')。 EDT 也是正在处理的线程,例如如果用户按下一个按钮但没有松开,则该按钮将重新绘制为“现在已按下”的外观。

有没有见过 napp 崩溃,以至于即使按下按钮也没有做任何事情,或者一旦你隐藏它并重新显示它甚至拖动任何窗口它就会变成暗灰色?

那将是违反该规则的应用程序。

你在美国东部时间睡觉。 这是禁止的.

阻塞行为:

  • 与数据库对话
  • 打开文件
  • 与网络上的任何东西互动
  • 等待线程。
  • A
    synchronized
    任何东西。
  • Thread.sleep
  • 还有很多很多。任何会导致线程休眠的事情,因为它在某些事件发生之前无法继续(磁盘准备好字节,一段时间过去,锁变得空闲,等等)。

解决方案不是先休眠 400 毫秒再行动。解决方案是创建一个等待 400 毫秒的新线程,然后将删除、重新验证和重新绘制的代码注入 EDT(毕竟,该线程不是 EDT,因此您可以在其中等待 400 毫秒,但您不能在 UI 上执行操作,因为您只能从 EDT 执行此操作)。

这很烦人,但有点常见,所以 swing 有它的用处:

SwingTimer
.

© www.soinside.com 2019 - 2024. All rights reserved.