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

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

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-28 11:00:02281browse

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

Javax.swing Timer Repeats Effectively, but 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.

Resolution

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn