0

それで、私は小さなゲームに取り組んでいますが、GUI を除いて、非常にうまく動作します。基本的に、ボタンをクリックするときの GUI を変更する必要があります。そのためには、次のコードを使用して EDT でコードを実行する必要があることに気付きました。

EventQueue.invokeLater(new Runnable () {
    @Override
    public void run() {
        // some code
    }
});

コードのどの部分がこれに関係しているかはわかりません。GUI (クラスのコンストラクター) を作成する部分は? または、値を変更する部分のみ(その場合Listener.actionPerformed())?実際にこれのボットをテストしましたが、どちらも機能しませんでした。

今私が知りたいのは、次のコードを変更して、クリックしたときにボタンを更新する方法です。上記のコードにその一部を埋め込む必要がありますか、それとも完全に間違っていますか?

package edttest;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class EDTtest {
    public static void main(String[] args) {
        GUI gui = new GUI ();
    }

    private static class GUI extends JFrame {

        int x;

        public GUI () {
            x = 0;
            setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
            JButton button = new JButton (String.valueOf(x));
            button.addActionListener(new Listener ());
            JLabel label = new JLabel (String.valueOf(x));
            add (label, BorderLayout.NORTH);
            add (button);
            pack();
            setVisible (true);
        }

        private class Listener implements ActionListener {

            @Override
            public void actionPerformed(ActionEvent e) {
                x++;
                System.out.println (x);
            }
        }
    }
}
4

1 に答える 1

2

EDT でこのコードを実行するかどうかに関係なく、ラベルには何も影響しません。xラベル自体が更新されるのは、インクリメントするためではありません。label#setText更新された値で呼び出す必要があります。

EDTに関するご質問について。Swing コンポーネントのすべてのアクセス/変更/作成/... は、EDT で行う必要があります。これは、メイン メソッドの内容を でラップする必要があることを意味しますSwingUtilities#invoke...。UI を介してトリガーされるすべてのイベント (ボタンのクリックなど) は、すでに EDT で処理されています。したがってRunnable、リスナーの EDT で明示的にスケジュールする必要はありません。

疑わしい場合は、 を使用して EDT を使用しているかどうかをいつでも確認できますEventQueue#isDispatchThread

Concurrency in Swingチュートリアルも読むことをお勧めします

于 2013-03-18T18:44:45.793 に答える