首页 > Java > java教程 > 为什么我的 Javax.swing 计时器有效重复,但 ActionListener 保持惰性?

为什么我的 Javax.swing 计时器有效重复,但 ActionListener 保持惰性?

Mary-Kate Olsen
发布: 2024-10-28 11:00:02
原创
432 人浏览过

Why does my Javax.swing Timer repeat effectively, but the ActionListener remains inert?

Javax.swing 定时器有效重复,但 ActionListener 保持惰性

在为应用程序制作动画时,发布者遇到了修改背景颜色的问题文本字段正在通过计时器机制传播,但预期的响应(重复的更改)并未在屏幕上显示。相关代码片段对应于:

<code class="java">Flash flash = new Flash();
tmr = new javax.swing.Timer(1000, flash); 
tmr.addActionListener(flash); 
tmr.setInitialDelay(0); 
tmr.setRepeats(true); 
tmr.start();</code>
登录后复制

调试时,发现操作侦听器循环遍历其替代方案,但仅显示初始更改。

解决方案

所呈现案例中的问题源于 ActionListener 实现中的内部缺陷。为了纠正这个问题并阐明底层操作,引入了一种替代解决方案,该解决方案对波动的饱和度级别进行建模:

<code class="java">public class FlashTest extends JPanel {
    // Building blocks
    Timer t = null; // Timer for the color transitions
    Queue<Color> clut = null; // Queue for holding a cycle of hues

    // Setup method
    FlashTest() {
        clut = new LinkedList<>(); // Initialize the color cycle
        for (int i = 0; i < N; i++) {
            clut.add(Color.getHSBColor(1, 1 - (i / N), 1));
        }
        for (int i = 0; i < N; i++) {
            clut.add(Color.getHSBColor(1, i / N, 1));
        }
        t = new Timer(50, new ActionListener() { // Timer for managing color transitions
            @Override
            public void actionPerformed(ActionEvent e) {
                setBackground(clut.peek()); 
                clut.add(clut.remove()); // Color transition management
            }
        });
        t.start(); // Commencement of color cycling
    }

    // Override necessitated by color cycling
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); // Call to superclass method for component depiction
        g.drawString(s, getWidth() / 2 - w2, getHeight() / 2 + h2); // Draw the text
    }

    // Launcher
    public static void main(String[] args) {
        EventQueue.invokeLater(() -> {
            JFrame f = new JFrame();
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.add(new FlashTest());
            f.pack();
            f.setVisible(true);
        });
    }
}</code>
登录后复制

这里,颜色循环维护在队列中,从而能够连续描述其进展。 “paintComponent”方法确保当前颜色在背景中持续显示。

这种补救措施不仅解决了原始问题,还演示了定时颜色过渡的实际实现。

以上是为什么我的 Javax.swing 计时器有效重复,但 ActionListener 保持惰性?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板