首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待计时器/进程结束后再继续

等待计时器/进程结束后再继续
EN

Stack Overflow用户
提问于 2015-05-07 07:17:17
回答 1查看 299关注 0票数 1

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

代码语言:javascript
复制
    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();
}
EN

回答 1

Stack Overflow用户

发布于 2015-05-07 13:37:03

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

您需要的是一个能够进行闪烁的地方。任何需要闪存的东西都可以在一个地方丢弃工作。一个知道按钮的位置,这样它就可以操纵它们的边界。让我们称它为flasherQueue

静态成员可用于此,但更灵活的设计是在按钮对象构造时将单个flasherQueue对象注入到每个按钮对象中。只有当按钮决定何时闪烁时,才需要了解flasherQueue的每个按钮。

此时,您可以自由地将按钮的flash()方法转换为阻塞调用。无论您决定闪烁一个按钮,只需将对该按钮的引用传递给flasherQueue即可。flasherQueue在它自己的线程中循环,通过按顺序给出的任何按钮,等待每个按钮完成闪烁。

这样一来,你一次最多只能有一个闪烁的按钮,并且应该可以自由地处理其他事件,所以你的GUI应该会重新绘制。

这实际上是producer / consumer的退化形式。只要你只有一个消费者在调用一个按钮,flash()一次只会闪烁一个按钮。在flasherQueue背后,你也许可以在你的数据结构中使用java的BlockingQueue

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30089277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档