アプリケーションをアニメーション化するコンテキストで、投稿者は背景色を変更すると問題が発生しました。テキストフィールドはタイマーメカニズムを通じて伝播されていましたが、予期された応答、つまり変更の繰り返しが画面上に視覚化されていませんでした。関連するコード スニペットは以下に対応します。
<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>
デバッグ時に、アクション リスナーが代替手段をループしていることが判明しましたが、最初の変更のみが表示されています。
今回の問題は、ActionListener 実装の内部欠陥から発生しました。これを修正し、根本的な動作を解明するために、変動する彩度レベルをモデル化する代替ソリューションが導入されています。
<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>
ここでは、カラー サイクルがキュー内に維持され、その進行を継続的に描写できます。 「paintComponent」メソッドは、背景に現在の色を常に表示することを保証します。
この解決策は、元の問題を解決するだけでなく、時間指定された色の遷移の実際的な実装も示します。
以上がJavax.swing タイマーが効果的に繰り返されるのに、ActionListener が不活性のままなのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。