私は最近取り組んでいるプロジェクトについて多くの質問をしています。これが私がいるシナリオであり、正しい方向への助けや指摘は大いに役立ちます...
これは、サーバーと複数のクライアントで構築されたネットワーク プログラムです。各クライアントには、サーバーから送信されたコマンドに従って動作する必要がある GUI があります。各クライアントは、 と呼ばれるクラス内にラップされますPlayer
。これPlayer
には GUI (extends JFrame
) と main メソッドがあり、サーバーには main メソッドのみ (GUI なし) があります。最初に、このクラスは次のようにメイン スレッドで作成されました。
EventQueue.invokeLater(new Runnable()
{
public void run()
{
new Player().setVisible(true);
}
});
クラス全体Player
が EDT で実行されていることに気付くまで、これは正常に機能していました。そのため、サーバーからのコマンドを待つと、そのコマンドが送信されて適切なアクションが実行されるまで、GUI 全体がロックされます。ご想像のとおり、これは恐ろしい設計であり、何かをチェックしたいときはいつでも、GUI が損なわれないように、クレイジーな回避策を見つけなければならないというコーディング環境の本当の苦痛であることが証明されました。
明らかに、別のスレッドでサーバーからのコマンドを確認し、EDT で GUI コンポーネントを実行する必要があります。私の 2 番目の実装には 2 つのクラスがありました。1 つは GUI 用で、もう 1 つはPlayer
. アイデアは、次のようなクラスPlayer
から GUI にアクセスできるように、GUI を保持する変数を持っているというものでした。Player
class Player
{
public GUI gui;
...
// And then start this gui inside of the EDT.
EventQueue.invokeLater(new Runnable()
{
public void run()
{
this.gui = new GUI().setVisible(true);
}
}
this
新しいオブジェクトの内部は.ではなくRunnable
オブジェクトを参照するため、これも機能しません。Runnable
Player
Player
1 つのスレッド内のクラスと EDT スレッド内の対応する GUI クラスとの間で通信するにはどうすればよいですか?