JPanelで同じままで再描画されないものをどのように描画できますか?交通シミュレーションプログラムを実行していますが、変更されないため、道路を一度描画したいと考えています。ありがとう
4 に答える
コンポーネントは、パネルが隠れるたびに再描画する必要があります (つまり、フレームが最小化されたり、別のウィンドウが上に置かれたりします)。したがって、一度だけ何かを描画しても、思い通りにはなりません。変更されない部分をより効率的に描画するには、一度「バッファ」画像に描画し、パネルまたはコンポーネントの再描画が必要になるたびにこのバッファを描画します。
// Field that stores the image so it is always accessible
private Image roadImage = null;
// ...
// ...
// Override paintComponent Method
public void paintComponent(Graphics g){
if (roadImage == null) {
// Create the road image if it doesn't exist
roadImage = createImage(width, height);
// draw the roads to the image
Graphics roadG = roadImage.getGraphics();
// Use roadG like you would any other graphics
// object to draw the roads to an image
} else {
// If the buffer image exists, you just need to draw it.
// Draw the road buffer image
g.drawImage(roadImage, 0, 0, null);
}
// Draw everything else ...
// g.draw...
}
私の知る限りでは、透明なオーバーレイを使用したトリックがない限り、いいえ。
私が見た (実際に行った) ほとんどのグラフィカル アプリケーションは、再描画のたびにパネル全体を再描画するだけでした。これで、グラフィック バッファ内でこれを 1 回行うことができます。その後、グラフィック バッファを JPanel にコピーすることで、背景全体を一度にすばやくペイントできます。すべてのグラフィック プリミティブを呼び出して道路を描画するよりも高速です。
または、一部の 2D ゲームのように、おそらく一度ペイントして、スプライトなどの可動部分を更新します。スプライトが使用していた古い場所を消去し (そこに背景を復元)、新しい場所でスプライトを再描画する必要があります。そのため、グラフィック バッファーに道路のコピーが残っていますが、毎回全体を再描画する代わりに、いくつかの小さな部分のみを更新します。少し速くなる可能性があります。
道路が再描画されないように実際に望んでいるかどうかはわかりません.ウィンドウのサイズが変更されたとき、または別のウィンドウがそれを遮った後に表示されたときに、再描画イベントが発生します。パネルが再描画されない場合、それは奇妙に見えます。
私が覚えている限りでは、Swing はこれらの状況に対して適切なペイント イベントのみを発生させるため、適切なオーバーライドを使用して JPanel をサブクラス化する通常の方法に従っても問題ありません。
public class RoadPanel extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// your drawing code here
}
}
一度描画した道路を画像または別のグラフィックス形式にキャッシュすると (表示データの計算を複数回節約するため)、その後のペイントで時間を節約できる場合があります。
私がしているのは、特定の部分を再描画する必要があるかどうかにブール値を設定することです。次に、paintComponent()
メソッドで値を確認し、特定のものを再描画するかどうかを指定できます。
protected void paintComponent(Graphics g){
super.paintComponent(g);
if (drawRoad) {
drawRoadMethod(g);
}
drawTheRest(g);
}
みたいな。