Heim > Java > javaLernprogramm > 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
Freigeben: 2024-10-28 11:00:02
Original
431 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage