java - 等待计时器/进程完成后再继续

标签 java process timer jbutton

我有一个函数可以闪烁 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();
}

最佳答案

这里遇到的一个基本问题是有多个按钮对象。这意味着每个 flash() 都存在于一个独立的对象中(因为它不是静态的)。这意味着每个按钮都不知道其他按钮是否闪烁。

您需要的是一个可以进行闪烁的地方。任何需要闪烁的地方都可以倾倒工作。一个了解按钮的地方,因此可以操纵它们的边框。我们将其称为 flasherQueue

可以使用静态成员来实现此目的,但更灵活的设计可以在构造每个按钮对象时将单个 flasherQueue 对象注入(inject)到每个按钮对象中。仅当按钮决定何时闪烁时,才需要每个按钮了解 flasherQueue。

此时,您可以自由地将按钮 flash() 方法设置为阻塞调用。无论您决定让按钮闪烁,只需将对按钮的引用传递给 flasherQueue 即可。 flasherQueue 在它自己的线程中循环,按顺序遍历所有按钮,等待每个按钮完成闪烁。

通过这种方式,您一次最多只能有一个闪烁按钮,并且可以自由地处理其他事件,以便您的 GUI 应该重新绘制。

这实际上是 producer / consumer 的退化形式。只要只有一个消费者调用按钮flash(),一次只有一个按钮会闪烁。您可能能够利用 java 的 BlockingQueue用于 flasherQueue 后面的数据结构。

关于java - 等待计时器/进程完成后再继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30089277/

相关文章:

Java - 根据条件将 for 循环计数器转回原处

java保存文件堆栈跟踪

linux - 对 "kernel process"的疑问

c# - Xamarin 安卓 : Get ALL processes located in memory

java - 在 Java 接口(interface)中处理 equals 和 hashCode 的微妙之处

java - 配置 SessionFactory : null

linux - RTW_CMD_THREAD 负责什么?

Android - 使用 Timer 和 TimerTask 控制任务?

c++ - 系统时钟和辅助时钟的区别

C: select()下部分代码不执行