等待定时器/过程完成后再继续

时间:2015-05-06 23:17:17

标签: 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();
}

1 个答案:

答案 0 :(得分:0)

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

你需要的是一个闪烁的地方。任何需要闪光的地方都可以抛弃工作。一个知道按钮的地方,以便它可以操纵它们的边界。让我们称之为flasherQueue

可以使用静态成员,但更灵活的设计会在构造时将单个flasherQueue对象注入每个按钮对象。只有当按钮决定何时闪烁时,才需要知道有关flasherQueue的每个按钮。

此时,您可以将按钮flash()方法设置为阻止呼叫。无论你决定闪一个按钮,只需将按钮的引用传递给flasherQueueflasherQueue循环在它自己的线程中,通过按顺序给出的任何按钮进行研磨,等待每个按钮完成闪烁。

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

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