2

Server は、JFrame を拡張して作成したクラスです。

    Server serverApp = new Server(TITLE, WIDTH, HEIGHT, true, false);

他のほとんどすべてのコードを効果的に削除しましたが、問題はまだ残っています!

    c = getContentPane();
    c.setLayout(new BorderLayout());

    //Components  /***AHHHHH***/
    lblEnterMessage = new JLabel("Enter Message ");
    txtEnterMessage = new JTextField(50);
    txtEnterMessage.addActionListener(this);
    btnSend = new JButton("Send");
    btnSend.addActionListener(this);
    taDisplay = new JTextArea("Test, test test.", 10, 0);
    taDisplay.setEditable(false);
    JScrollPane jspDisplay = new JScrollPane(taDisplay);

    pnlChatTop = new JPanel(new FlowLayout());
    pnlChatTop.add(lblEnterMessage);
    pnlChatTop.add(txtEnterMessage);
    pnlChatTop.add(btnSend);
    pnlChat = new JPanel(new BorderLayout());
    pnlChat.add(pnlChatTop, BorderLayout.CENTER);
    pnlChat.add(jspDisplay, BorderLayout.SOUTH);

    c.add(pnlChat, BorderLayout.CENTER);

ああ、それは突然機能しました...そして、私はこの質問を削除しようとしていましたが、数回再実行しましたが、ランダムに機能し、時々機能しません。

以前に他の「プロジェクト」でこの問題が発生したことを思い出しました。私の解決策は、ウィンドウのサイズを変更できるようにすることでした。単純にサイズを変更すると、コンポーネントが表示されます。

今回は、ゲームを作成していて、サイズを変更したくありません... とにかく、この問題を永久に適切な方法で修正する方法を知りたいです。

ヘルプ!なぜこれが起こっているのか誰にも分かりますか?

ありがとう。

編集:

public Server(String title, int sizeW, int sizeH, boolean visibility, boolean resizability) {

    /* Initialization */
    //JFrame settings
    setTitle(title);
    setSize(sizeW, sizeH);
    setVisible(visibility);
    setResizable(resizability);
    setLocationRelativeTo(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    addKeyListener(this);

それは役に立ちますか?

4

3 に答える 3

4

あなたが提供したコードからは問題は明らかではありません。

setVisible(true)を呼び出す前に、 pack()setSize(int,int)setExtendedState(int)および/またはsetResizable(boolean)メソッドの組み合わせが必要なようです。


編集:

setTitle(title);
setSize(sizeW, sizeH);
setVisible(visibility);
setResizable(resizability);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

このコードには競合状態があります。フレームが表示される前に、メイン スレッドがコンポーネントを正しい状態にしてペイントすることがあります。すべての準備が整う前に、フレームが勝ち、ペイントを開始することがあります。

Swing を使用することの利点は、マルチスレッド コードを自動的に処理できることです。メイン スレッドでコントロールを初期化することは一般的に安全ですが、イベント ディスパッチ スレッドを開始すると (setVisible(true)確実に開始されます)、すべての賭けはオフになります。

呼び出しsetVisible(true)をできるだけ遅らせる。JFrameできれば、コンストラクター内から呼び出さないでください。

アプリケーションを起動した後に Swing コントロールを変更する必要がある場合は、イベント ディスパッチ スレッドを介して行う必要があります (とりわけ、 SwingUtilitiesinvokeLaterのおよびinvokeAndWaitメソッドを参照してください)。

于 2010-01-30T12:39:00.707 に答える
3

この種の断続的な障害は、同期の問題を示唆しています。EDTで GUI をビルドして実行してください 。さらに、この非常に単純な ~100 行の GUIチャット プログラムをご覧になることをお勧めします。

于 2010-01-30T12:59:06.333 に答える
2

setVisible の呼び出しが早すぎます。すぐに実行され、呼び出された時点でウィンドウを描画します。すべてのコンポーネントをフレームに追加していない場合、それらはペイントされません。そのため、フレームのサイズを変更すると表示されるようです。サイズを変更すると再描画が実行されるためです。

setVisible を JFrame のコンストラクターでの最後の呼び出しにします。

于 2010-01-30T13:07:22.507 に答える