ホームページ  >  記事  >  Java  >  タイマーが正しく繰り返しているにもかかわらず、Java Swing タイマーの ActionListener がアクションをトリガーしないのはなぜですか?

タイマーが正しく繰り返しているにもかかわらず、Java Swing タイマーの ActionListener がアクションをトリガーしないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-01 03:50:28870ブラウズ

Why is my Java Swing Timer's ActionListener not triggering actions despite the timer repeating correctly?

Javax.swing タイマーは正常に繰り返しますが、ActionListener は何もしません

提供されたコード スニペットでは、タイマーは次のように正常に構成されています。一定の間隔で繰り返します。ただし、タイマーに関連付けられた ActionListener は、タイマーの期限が切れてもアクションをトリガーしません。

ActionListener の actionPerformed メソッドは、タイマーがトリガーされたときにアクションを実行します。この場合、メソッドはテキスト フィールドの背景色を白とピンクの間で切り替えようとします。ただし、タイマーが継続的に実行されているにもかかわらず、テキスト フィールドの背景色は変化しません。

問題の根本は、静的内部クラスを ActionListener として使用していることにあります。静的内部クラスには、それを囲んでいるクラスの静的メンバーのみにアクセスできるという独特の特性があります。この場合、spreademPanel 変数とhistoryPnl 変数は静的ではないため、Flash クラス内ではアクセスできません。

これを解決するには、spreademPanel とhistoryPnl を静的にするか、Flash クラスのインスタンスを作成して渡すことができます。これを ActionListener として使用します。

インスタンスベースのアプローチの例を次に示します:

<code class="java">// Instance-based ActionListener
class Flash implements ActionListener
{
    private JComponent textfield;

    public Flash(JComponent textfield) {
        this.textfield = textfield;
    }

    @Override
    public void actionPerformed(ActionEvent evt)
    {
        if (this.flasher)
        {
            textfield.setBackground(Color.white);
        }
        else
        {
            textfield.setBackground(Color.pink);
        }
        this.flasher = !this.flasher;
    } //actionPerformed
} 

// Main class
...
// Setup timer
Flash flash = new Flash(SpreademPanel.historyPnl.NameTxt); // Pass the text field to the Flash instance
tmr = new javax.swing.Timer(1000, flash);
...</code>

以上がタイマーが正しく繰り返しているにもかかわらず、Java Swing タイマーの ActionListener がアクションをトリガーしないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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