Java 等待计时器/进程完成,然后继续

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

我有一个函数,它可以闪烁一行中多次调用的JButton的边框。我希望只有在整个函数完成后,流程才能继续。现在,一个按钮开始闪烁,然后在第一个按钮停止闪烁之前,另一个按钮开始闪烁。该函数在扩展JButton的类中如下所示:

    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小程序游戏。我提交了这个项目,最终发现了一些“有效”的东西。它虽然不是很理想,但我确实在考虑重新编写很多程序,因为有太多的课程相互重叠。再次感谢!今年夏天我在重写游戏时会记住这一点!