如何在 AWTEventQueue 中暂停执行 X 毫秒

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

我有一个游戏,我想让一个组件闪烁红色,然后恢复到正常颜色。如果我将其设置为红色,然后恢复正常,则闪光发生得太快。显然,我可以这样做

Thread.sleep(123)
,但这是非常不可取的,因为它会破坏我的 UI 上的东西。另外,我很确定这不是我应该在这里做的事情。

现在,我可以暂停队列,然后使用

SwingUtilities::invokeLater
。但我想要求学习这里的最佳实践。

在 Swing/AWT 事件之间添加特定长度暂停的最佳方法是什么?

这是一个可运行的示例。

import javax.swing.*;
import java.awt.*;

public class cry {

    public static void main(final String[] args) {

        SwingUtilities.invokeLater(cry::blah);

    }

    private static void blah() {
        final JFrame frame = new JFrame();
        frame.setTitle("ABC");
        frame.setLocationByPlatform(true);
        frame.setSize(300, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);

        try {
            Thread.sleep(10_000); //sleep for 10 seconds
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        
        frame.setTitle("XYZ");
    }

}

java swing awt pause awt-eventqueue
1个回答
0
投票

为了实现你的目标,你可以使用SwingTimer类:

timer = new Timer( 1500, e -> {
   panel.setBackground( Color.darkGray );
   frame.setTitle( "XYZ" );
   timer.stop();
} );
timer.setInitialDelay( 3500 );
timer.setRepeats( false );
timer.start();

可以看到,实现非常简单,首先我们实例化Timer

timer = new Timer(

作为参数,我们将重复之间的时间传递给它(尽管在本例中未使用它们):

1500,

还有一个将执行代码的巴巴(抽象类):

e -> {

在其中,我们放置要执行的代码,并且由于我们不需要重复, 我们调用 timer.stop() 来停止其执行。

   panel.setBackground( Color.darkGray );
   frame.setTitle( "XYZ" );
   timer.stop();
} );

剩下的就是完成计时器的设置并启动它。 我们标明从开始到第一次执行的时间:

timer.setInitialDelay( 3500 );

我们表明我们不希望重复:

timer.setRepeats( false );

我们开始吧:

timer.start();

注意:你会注意到我将frame的声明分开,将其放在类的主体中,并在blah中进行实例化,这是必要的,因为对timer.stop()的调用,在 lambda 内部,也就是说在内部类内部,从那个地方,只能“看到”父类的属性。

import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;  // not "java.util.Timer"

public class cry {
   Timer timer;
   JPanel panel;
   JFrame frame;

   public static void main( String[] args ) {
      Cry cry = new Cry();
      SwingUtilities.invokeLater( cry :: blah );
   }

   private void blah() {
      frame = new JFrame();
      frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
      frame.setLocationByPlatform( true );
      frame.setSize( 300, 300 );
      frame.setTitle( "ABC" );
      panel = new JPanel();
      panel.setBackground( Color.red );
      panel.setSize( 300, 300 );
      frame.add( panel );
      frame.setVisible( true );
      timer = new Timer( 1500, e -> {
         panel.setBackground( Color.darkGray );
         frame.setTitle( "XYZ" );
         timer.stop();
      } );
      timer.setInitialDelay( 3500 );
      timer.setRepeats( false );
      timer.start();
   }
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.