我的代码目前看起来像这样,我想在发布代码发生之后,但在游戏开始之前延迟这个过程,但目前看起来发布代码根本没有发生。看起来好像在延迟之后立即开始,这是我不想要的。如果有人可以帮助,谢谢。 ````
这是我的代码。 (不好意思抱歉)
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();
几乎所有的 UI 系统,swing(您在这里使用的系统)就是其中之一,都有这个称为事件调度线程或 EDT 的概念。
EDT 有很多特性:
jLabel.setText("Hello")
、删除或添加小部件、更改某些东西的颜色等等)必须 从 EDT 完成。如果您从任何其他线程执行此操作,就会发生奇怪的事情。有没有见过 napp 崩溃,以至于即使按下按钮也没有做任何事情,或者一旦你隐藏它并重新显示它甚至拖动任何窗口它就会变成暗灰色?
那将是违反该规则的应用程序。
你在美国东部时间睡觉。 这是禁止的.
阻塞行为:
synchronized
任何东西。Thread.sleep
解决方案不是先休眠 400 毫秒再行动。解决方案是创建一个等待 400 毫秒的新线程,然后将删除、重新验证和重新绘制的代码注入 EDT(毕竟,该线程不是 EDT,因此您可以在其中等待 400 毫秒,但您不能在 UI 上执行操作,因为您只能从 EDT 执行此操作)。
SwingTimer
.