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