Heim  >  Artikel  >  Java  >  Warum wiederholt sich mein Javax.swing-Timer effektiv, der ActionListener bleibt jedoch inaktiv?

Warum wiederholt sich mein Javax.swing-Timer effektiv, der ActionListener bleibt jedoch inaktiv?

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

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

Der Javax.swing-Timer wird effektiv wiederholt, aber ActionListener bleibt inaktiv

Im Zusammenhang mit der Animation einer Anwendung war der Poster auf ein Problem gestoßen, bei dem Änderungen an der Hintergrundfarbe von vorgenommen wurden Ein Textfeld wurde über den Timer-Mechanismus weitergegeben, die erwartete Reaktion, eine wiederholte Änderung, wurde jedoch nicht auf dem Bildschirm angezeigt. Das relevante Code-Snippet entspricht:

<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>

Beim Debuggen wurde festgestellt, dass der Aktions-Listener seine Alternativen durchläuft, aber nur die anfängliche Änderung anzeigt.

Lösung

Das Problem im vorliegenden Fall entstand durch einen internen Fehler in der ActionListener-Implementierung. Um dies zu beheben und den zugrunde liegenden Vorgang zu verdeutlichen, wird eine alternative Lösung vorgestellt, die einen schwankenden Sättigungspegel modelliert:

<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>

Hier wird der Farbzyklus in einer Warteschlange beibehalten, was eine kontinuierliche Darstellung seines Verlaufs ermöglicht. Die Methode „paintComponent“ sorgt für die konstante Anzeige der aktuellen Farbe im Hintergrund.

Diese Lösung behebt nicht nur das ursprüngliche Problem, sondern demonstriert auch eine praktische Umsetzung zeitgesteuerter Farbübergänge.

Das obige ist der detaillierte Inhalt vonWarum wiederholt sich mein Javax.swing-Timer effektiv, der ActionListener bleibt jedoch inaktiv?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn