Java 2Dグラフィックスの長方形
質問
キャンバスにグラフデータ構造を描画できるJavaアプレットを作成しようとしています。これを行うには、ノードを作成する場所をクリックし、ノードをクリックして接続します。問題は、 paint()
メソッドを正しく動作させることができないことです。 mousePressed(MouseEvent e)
メソッド内のグラフ(およびキャンバス上の四角形)に新しいノードを追加します。
Graphics g = this.getGraphics();
g.setColor(Color.blue);
g.fillRect(e.getX(), e.gety(), 40, 40);
ウィンドウのサイズを変更すると、すべての四角形が消えるまで、すべてが正常に機能します。 paintメソッドを空のメソッドにオーバーライドしましたが、それでも同じことが起こります。 paint()内にfillRectコマンドを追加することはできません。ユーザーがマウスを使用して操作するまで、どの長方形が存在するかわからないからです。
マウスリスナメソッド内で g.fillRect()
を使用し、それらを固定するにはどうすればよいですか
解決
問題は、描画先の場所が永続的でないことです。いつでも、描いたものはすべて失う可能性があります。これが発生すると、paint(Graphics)メソッドが呼び出されます。これが発生するたびに画像全体を再描画するか、必要に応じてアプレットのグラフィックスに描画してコンテンツをコピーするキャンバスを確保する必要があります。
画像を作成して描画する方法は次のとおりです。
http://java.sun.com/docs/books/tutorial/2d/images/drawonimage.html
次に、paintメソッドで、GraphicsのdrawImage(...)メソッドを使用して、作成した画像を表示します。
他のヒント
これを正しく読んでいるかどうかわかりませんが、最後にクリックした場所を、paint()メソッドが呼び出されたときに後でペイントされる変数に保存するだけではどうですか?
ウィンドウサイズ変更アクションリスナーをオーバーライドし、その中を塗り直します。
グラフィックは一時的なものです。領域が汚れると、再描画されます。
最善の方法は、BufferedImageを作成し、mousePressedでペイントし、repaintを呼び出すことです。
ペイントが呼び出されたら、渡されたグラフィックスオブジェクトにイメージを描画します。これにより、長方形を保存する必要がなくなり、パフォーマンスが向上するバッファーが得られます。