2

独占ボード上のスペースを表すカスタム JButton クラスを作成しました。ゲームはマルチプレイヤーであるため、ボタンを描画するために必要な多くの情報がサーバーに保持されます (RMI 経由でアクセス)。

私の問題は、ボタンの上にマウスを置くと、自動的に repaint() を呼び出すように見える (そして境界線を描画する) ことです。これにより、マウスがスペースの 1 つの上にあるたびにサーバーからデータを取得する必要があるため、プログラムが非常に遅くなります。

私はこれを止める方法を見つけようとしていますが、インターネット上の他の誰もがボタンを止めるのではなく repaint() することに問題を抱えているようです.

これを防ぐためにオーバーライドできるメソッドまたは変更できるプロパティを知っている人はいますか?

4

4 に答える 4

4

あなたのデザインを再考することをお勧めします。私はすべての要因を知っているわけではないことを認めますが、あなたの説明から、ボードの状態が頻繁に変化することはないと思うので、ペイントを試みるたびにサーバーを呼び出す理由はないはずです. repaint代わりに、サーバーがゲーム イベントをクライアントにブロードキャストする場合、呼び出しが行われ たときにローカルで必要な状態が得られます。

repaintまた、あなたの説明から、マウスイベントによってトリガーされて、コード内からサーバーを呼び出すことができるように聞こえます。これは、EDT で十分に実行できます。GUI の残りの部分が遅くなるため、ペインティング スレッドでサーバー呼び出しを行うべきではありません。長時間実行される呼び出しは、ワーカー スレッドで行う必要があります。詳細については、SwingWorkerSwingのスレッド化に関する概念を参照してください。

それでも、再描画ロジックをいじるのが最善の策だとは思いません。ボタン自体をレンダリングするために必要なものをボタンに提供することは、より良いステップです。

于 2010-06-28T12:33:44.050 に答える
2

サーバー呼び出しは言うまでもなく、swing コンポーネントの repaint() (および paint()) メソッドで大きな計算を行うべきではありません...

于 2010-06-28T12:29:14.607 に答える
1

もちろんできますが、簡単ではありません。

JButton にペイントしようとしているものは何でも、BufferedImage にダンプします。JButton の paint() は、基本的にバッファリングされた画像を返す必要があります。BufferedImages は、再描画中は非常に高速です。それらは単なるピクセルのマトリックスであり、再描画の間にほとんど時間がかかりません。

package test;

import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ButtonTest {
    public static void main(String[] args){
        new ButtonTest().test();
    }

    public void test(){
        JFrame frame = new JFrame("TestFrame");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel pnl = new JPanel();
        pnl.add(new MyButton());
        frame.add(pnl);
        frame.setSize(600, 600);
        frame.setVisible(true);
    }

    class MyButton extends JButton{
        public void paint(Graphics g){
            //return a buffered image everytime
        }
    }
}

上記の手法は少しばかげているように見えますが、基本的にはメモリ内に 1 つのバッファリングされた画像を持つことができ、それは paint() メソッドから返される必要があります。また、サーバー (RMI) から受け取ったものはすべて、バックグラウンドで実行されている別のスレッドを使用して BufferedImage オブジェクトにダンプできます。

于 2010-06-28T12:16:31.157 に答える
1

フォーカス境界の描画を無効にしてみましたか? 詳細については、JButton API ドキュメントを参照してください。

また、ボタンに表示されるデータをキャッシュすることもできます。そして、ボタンはあなたがやろうとしていることに対して本当に適切ですか? ユーザーは、既知の GUI 要素が非常に具体的な方法で反応することを期待していることを思い出してください。

于 2010-06-28T12:27:12.957 に答える