現在、私はJFrame
を含むを持っていますJPanel
。これJPanel
は私のプログラムのペイントです。Graphics g
私の.drawString のものすべてを意味するペイント。現在、ユーザーがJFrame
を操作するたびに表示のみを更新しますが、while ループを使用せずに継続的に更新 ( repaint()
) したい (CPU 使用率が高すぎる)。
どうすればこれができるか知っている人はいますか?
現在、私はJFrame
を含むを持っていますJPanel
。これJPanel
は私のプログラムのペイントです。Graphics g
私の.drawString のものすべてを意味するペイント。現在、ユーザーがJFrame
を操作するたびに表示のみを更新しますが、while ループを使用せずに継続的に更新 ( repaint()
) したい (CPU 使用率が高すぎる)。
どうすればこれができるか知っている人はいますか?
私は完全に機能するインターネット リレー チャット システムを実装しました。ペイントを使用して、あなたや他の人が何を言っているのかを確認します。
サーバーから更新を「プル」しようとしているように思えます。次に、SwingWorker を使用してサーバーに更新をクエリし、更新を GUI にプッシュできます。サーバーを継続的にポーリングしないように、SwingWorker をスリープ状態にする必要があります。
詳細については、ワーカー スレッドと SwingWorkerに関する Swing チュートリアルのセクションを参照してください。
おそらく、サーバーがクライアントに更新を「プッシュ」し、クライアントが変更をリッスンしてから再描画する必要があるためのより良い設計です。ソケットのすべてのセクションが役立つかもしれません。
編集:
これは、5年以上見ていない古いコードです。「クライアント」は、入力された各文字を「サーバー」に送信する単純なテキスト ペインです。次に、サーバーは、サーバーに接続されている他のクライアントに各文字を送信します。サーバーには最新のドキュメントがあるという考えです。1 つのクライアントが変更を送信すると、他のすべてのクライアントに変更が通知されます。このようにして、すべてのクライアントに常に同じデータが含まれます。完全なメッセージのみをサーバーに送信するため、コードはより単純になります。コードを実行するには、DOS ウィンドウを開いて次のように入力します。
Java ドキュメント サーバー 1234
これにより、ポート 1234 をリッスンするサーバーが起動します
次に、別のウィンドウを開いて入力します
Java DocumentClient 1234 3
これにより、サーバーに接続する 3 つのクライアント フレームが作成されます。フレームのいずれかを入力すると、サーバーが更新されます。
zip ファイルは次の場所から取得できます。
必要なことは、パネル上の画像の一部が変更されたことを知っているときはいつでも、swing コンポーネントに通知することです。これを行う通常の方法は、あなたが言ったように呼び出すrepaint()
ことです。「無効化」された長方形がわかっている場合は、それを示すこともできます。
のコンテンツを引き起こすイベントに応じて、JPanel
アプリケーションのプレゼンテーション部分が下のデータの変更を「リッスン」し、これらの変更が発生したときに再描画するように、アプリケーションの設計を変更する必要があります。
特定の状況で実行できる別の方法がありpaintImmediately()
ますが、シナリオをもう少し説明する必要があり、どの場合に継続的に再描画する必要があるかを説明する必要があります。