Home >Java >javaTutorial >Why does my Javax.swing Timer repeat effectively, but the ActionListener remains inert?
In the context of animating an application, the poster had encountered a problem where modifications to the background color of a textfield were being propagated through the timer mechanism, yet the expected response, a repeated change, was not being visualized on the screen. The relevant code snippet corresponds to:
<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>
Upon debugging, the action listener was discovered to be looping through its alternatives but only displaying the initial change.
The issue in the presented case arose from an internal flaw in the ActionListener implementation. To rectify this, and elucidate the underlying operation, an alternative solution is introduced that models a fluctuating saturation level:
<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>
Here, the color cycle is maintained in a queue, enabling a continuous depiction of its progression. The 'paintComponent' method ensures the constant display of the current color in the background.
This remedy not only resolves the original issue but also demonstrates a practical implementation of timed color transitions.
The above is the detailed content of Why does my Javax.swing Timer repeat effectively, but the ActionListener remains inert?. For more information, please follow other related articles on the PHP Chinese website!