私のクライアント/サーバー Java アプリケーションで、最初のもの (ログイン 1) よりもコンテンツが JFrame に表示されないという奇妙な動作を発見しました。
JFrame は表示されますが、透過的であり、サイズを変更すると次のような効果があります。
アプリケーションは次のように動作します (2 つのメイン、サーバー クラスに 1 つ、クライアント クラスに 1 つ)。
サーバー側 1)メインには無限ループがあり、クライアントが接続するとメッセージを処理する新しいスレッドが開始されます
クライアント側 1) メインは、GuiLogin JDialog のシングルトンを取得し、それを表示するメソッドを実行します
2) ユーザーが Login を押すと、guilogin の ActionListener がクライアント メソッドを呼び出して、LoginRequest オブジェクトをサーバーにディスパッチし、LoginResponse オブジェクトで応答します。
3)電子メールとパスワードが正しい場合(email = a、password = b)、別のJFrameが表示されるはずですが、何を試しても、常にバグのある透明なフレームが表示されました
3b) 電子メールとパスワードが正しくない場合、アプリケーションは JDialog を表示します (正常に動作します)。
私の間違いはどこか概念的なものだと思います。コードは問題ないように見えます。新しい JFrame を次のように呼び出します。
guiLogin.dispose();
JFrame j = new JFrame();
j.setVisible(true);
スタンドアロン コードとして機能しますが、クライアントの Visitor-pattern メッセージ ハンドラーのメソッド内では、スクリーンショットのように機能します
バグに関係のないすべてのクラスとメソッドを削除した、eclipse プロジェクトの縮小版
編集:私は Java Gui とイベントについて非常に経験がありません。問題の原因となっているコードが EDT 内にあることを確認しました ( javax.swing.SwingUtilities.isEventDispatchThread() は true を返します)。メッセージ処理ロジック全体を SwingWorker スレッド内に移動する必要がありますか?