gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 13:53:19 25 4
gpt4 key购买 nike

我有一个函数可以闪烁 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com