ホームページ  >  記事  >  Java  >  Javax.swing タイマーが効果的に繰り返されるのに、ActionListener が不活性のままなのはなぜですか?

Javax.swing タイマーが効果的に繰り返されるのに、ActionListener が不活性のままなのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-28 11:00:02281ブラウズ

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

Javax.swing タイマーは効果的に繰り返しますが、ActionListener は不活性なままです

アプリケーションをアニメーション化するコンテキストで、投稿者は背景色を変更すると問題が発生しました。テキストフィールドはタイマーメカニズムを通じて伝播されていましたが、予期された応答、つまり変更の繰り返しが画面上に視覚化されていませんでした。関連するコード スニペットは以下に対応します。

<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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。