再描画されないjPanelに何かを描画するにはどうすればよいですか?
質問
JPanelで、同じままで塗り直されない何かを描画するにはどうすればよいですか?交通シミュレーションプログラムを実行していますが、道路は変更されないため、一度描画したいです。 ありがとう
解決
実際に道路を再描画したくないのかどうかわからない-ウィンドウのサイズが変更されたとき、または別のウィンドウがウィンドウを遮って表示されたときに、再描画イベントが発生する(たとえば)。パネルが再描画されない場合は、奇妙に見えます。
私が覚えている限りでは、Swingはこれらの状況に対して適切なペイントイベントのみを起動するため、適切なオーバーライドでJPanelをサブクラス化する通常の方法に従ってください。
public class RoadPanel extends JPanel {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// your drawing code here
}
}
一度描画された道路を画像または別のグラフィック形式にキャッシュすると(表示データの計算を複数回保存するために)、これにより後続のペイントの時間を節約できます。
他のヒント
私の知る限り、透明オーバーレイを使用したトリックがない限り、いいえ。
私が見た(そして行った)ほとんどのグラフィカルアプリケーションは、各再描画でパネル全体を再描画するだけです。これで、グラフィックバッファーで一度だけ実行し、グラフィックバッファーをJPanelにコピーすることで、背景全体を一度にすばやくペイントできます。すべてのグラフィカルプリミティブを呼び出して道路を描くよりも高速です。
または、一部の2Dゲームの方法では、おそらく一度ペイントして、スプライトなどの可動部分を更新します。スプライトが使用していた古い場所を消去し(背景を復元し)、スプライトを再描画する必要があります新しいところ。したがって、道路のコピーはグラフィックバッファに残っていますが、毎回全体を再描画するのではなく、いくつかの小さな部分のみを更新します。少し速くなることがあります。
パネルが隠れるたびにコンポーネントを再描画する必要があります(つまり、フレームを最小化/別のウィンドウを最前面に配置)。したがって、何かを一度だけ描いても、思い通りに機能しません。変化しない部分をより効率的に描画するには、それらを「バッファ」イメージに一度描画し、パネルまたはコンポーネントを再描画する必要があるたびにこのバッファを描画します。
// 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...
}
特定のパーツを再描画する必要があるかどうかにブール値を設定します。次に、 paintComponent()
メソッドで値を確認し、特定のものを再描画するかどうかを指定できます。
protected void paintComponent(Graphics g){
super.paintComponent(g);
if (drawRoad) {
drawRoadMethod(g);
}
drawTheRest(g);
}
Kinda like like。