Java 等待计时器/进程完成,然后继续
我有一个函数,它可以闪烁一行中多次调用的JButton的边框。我希望只有在整个函数完成后,流程才能继续。现在,一个按钮开始闪烁,然后在第一个按钮停止闪烁之前,另一个按钮开始闪烁。该函数在扩展JButton的类中如下所示:Java 等待计时器/进程完成,然后继续,java,process,timer,jbutton,Java,Process,Timer,Jbutton,我有一个函数,它可以闪烁一行中多次调用的JButton的边框。我希望只有在整个函数完成后,流程才能继续。现在,一个按钮开始闪烁,然后在第一个按钮停止闪烁之前,另一个按钮开始闪烁。该函数在扩展JButton的类中如下所示: public void flash() { final Timer timer = new Timer(7, new ActionListener() { @Override public void actionPerformed
public void flash() {
final Timer timer = new Timer(7, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
alpha += increment;
if (alpha >= 255) {
alpha = 255;
increment = -increment;
}
if (alpha <= 0) {
alpha = 0;
increment = -increment;
}
setBorder(BorderFactory.createLineBorder(new Color(81, 171, 112, alpha), 4));
}
});
timer.start();
final Timer delay = new Timer(
2000,
new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0, 0), 0));
timer.stop();
}
});
delay.setRepeats(false);
delay.setCoalesce(true);
delay.start();
}
public void flash(){
最终计时器=新计时器(7,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
α+=增量;
如果(α>=255){
α=255;
增量=-增量;
}
如果(alpha这里的一个基本问题是有多个按钮对象。这意味着每个flash()
都位于一个独立的对象中(因为它不是静态的)。这意味着每个按钮都不知道其他按钮是否在闪烁
你需要的是一个进行闪烁的地方。一个需要闪烁的地方可以转储工作。一个知道按钮的地方,这样它可以操纵按钮的边框。让我们称之为flashrqueue
静态成员可用于此目的,但更灵活的设计将在构建每个按钮对象时将单个flashrqueue
对象注入到每个按钮对象中。只有当按钮决定何时闪烁时,才需要了解flashrqueue的每个按钮
此时,您可以自由地制作按钮flash()
方法转换为阻塞调用。无论您决定闪烁一个按钮,只要将对按钮的引用传递到flashrqueue
。flashrqueue
,在它自己的线程中循环,按顺序研磨任何按钮,等待每个按钮完成闪烁
通过这种方式,一次最多只能有一个闪烁按钮,并且可以自由处理其他事件,这样GUI就可以重新绘制
这实际上是一种退化形式的。只要只有一个消费者调用按钮flash()
一次只有一个按钮会闪烁。您可能能够利用java来处理flashrqueue
后面的数据结构,请编辑您的问题,使您所需的行为更清晰。如果“进程”您是指当前线程中除了flash()
代码之外的任何代码,您可以简单地将flash()
设置为阻塞调用。但是,我怀疑您真正想要的是每次调用flash()
都将必须等待所有先前flash()的事件排队
调用以完成。因此允许其他代码继续并仅延迟flash()
code.BTW,delay.setCoalesce(true);
对您没有任何帮助,因为true
是默认设置。谢谢您的帮助,但您是对的。我想要所有flash()调用完成后再调用下一个。听起来很好!其中一些肯定是我想不起来的,但我想我已经明白了你要说做什么的要点。有很多事情我必须研究。我正在为我在大学上的一门课制作一个Java小程序游戏。我提交了这个项目,最终发现了一些“有效”的东西。它虽然不是很理想,但我确实在考虑重新编写很多程序,因为有太多的课程相互重叠。再次感谢!今年夏天我在重写游戏时会记住这一点!