我有一个游戏,我想让一个组件闪烁红色,然后恢复到正常颜色。如果我将其设置为红色,然后恢复正常,则闪光发生得太快。显然,我可以这样做
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");
}
}
为了实现你的目标,你可以使用Swing的Timer类:
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();
}
}