私は、異なるレイヤーの2つのJPanelを含むJLayeredPane(レイヤーと呼ぶ)を持つアプリケーションを作成しています。私はグリッドをペイントするように、下部にあるJPanelのpaintComponentメソッドをオーバーライドする(grid_panelと呼ぶ)ので、グリッドをペイントし、topのpaintComponentメソッド(circuit_panelと呼ぶ)を使って回路をペイントする。JLayeredPaneとペイント
はここ構造の概要です:
layers -
|-circuit_panel (on top)
|-grid_panel (at bottom)
私はgrid_panelが静的滞在したい、それは変更されませんので、すなわち、(初期のものを除く)任意の再描画を行うにはありません。
問題は、私はcircuit_panel.repaint()を呼び出すたびに、grid_panelも同様に再描画されます!これは間違いなく効率的です。
これは、JLayeredPaneの熱心な絵の動作が原因だと思います。 JLayeredPaneでこの機能を無効にする方法はありますか?
あなたは上記の効果を見て興味を持っている場合は、私は小さなデモプログラム書いた:あなたが見つけたようBufferedImage
は、効率的なレンダリングのための複雑なコンテンツをキャッシュするための効果的な方法で、
public class Test2 extends JFrame {
public Test2() {
JLayeredPane layers = new JLayeredPane();
layers.setPreferredSize(new Dimension(600, 400));
MyPanel1 myPanel1 = new MyPanel1();
MyPanel2 myPanel2 = new MyPanel2();
myPanel1.setSize(600, 400);
myPanel2.setSize(600, 400);
myPanel1.setOpaque(false);
myPanel2.setOpaque(false);
myPanel2.addMouseListener(new MyMouseListener(myPanel2));
layers.add(myPanel1, new Integer(100)); // At bottom
layers.add(myPanel2, new Integer(101)); // On top
this.getContentPane().add(layers, BorderLayout.CENTER);
this.setSize(600, 400);
}
class MyPanel1 extends JPanel {
Color getRandomColor() {
int r = (int) (256 * Math.random());
int g = (int) (256 * Math.random());
int b = (int) (256 * Math.random());
return new Color(r, g, b);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(getRandomColor());
g2d.fillRoundRect(30, 30, 60, 60, 5, 5);
}
}
class MyPanel2 extends JPanel {
Color getRandomColor() {
int r = (int) (256 * Math.random());
int g = (int) (256 * Math.random());
int b = (int) (256 * Math.random());
return new Color(r, g, b);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(getRandomColor());
g2d.fillRoundRect(45, 45, 75, 75, 5, 5);
}
}
class MyMouseListener extends MouseAdapter {
JPanel panel;
MyMouseListener(JPanel panel) {
this.panel = panel;
}
@Override
public void mouseClicked(MouseEvent e) {
panel.repaint();
}
}
/**
* @param args
*/
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
(new Test2()).setVisible(true);
}
});
}
}
私は高価で描画する場合は、多分二重のあなたの層をバッファリングから離れてこの問題を回避することができなくなりますかなり確信しています。レイヤーが同じスクリーンスペースを共有しているため、1つのペイントで別のペイントのペイントを再描画するため、「ダーティー」領域を追跡するRepaintManagerがすべて降ります。 – Adam
JPanelはペイントするべきものをキャッシュする方法があります(塗りつぶされたものは静的でなければなりません)。そして、これらの計算を繰り返し行うのではなく、キャッシュをペイントするようにrepaint()をしますか? – stackoverflower
もサイズを変更すると+1がひどいですが、別の問題がありますが、[JLayer(Java7以降)](http://stackoverflow.com/a/9272534/714968)または 'JXLayer( Java3のための) ' – mKorbel