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