5
我正在寫一個應用程序,它有一個包含兩個JPanel的JLayeredPane(稱爲圖層),它位於不同的圖層中。我覆蓋底部JPanel的paintComponent方法(稱爲grid_panel),以便繪製網格,並在頂部繪製paintComponent方法(稱爲circuit_panel),以繪製電路。JLayeredPane和繪畫
這裏的結構的總結:
layers -
|-circuit_panel (on top)
|-grid_panel (at bottom)
我想grid_panel留靜態的,即,不要做任何重繪(除了最初的一個),因爲它不會改變。
問題是,每當我打電話給circuit_panel.repaint()時,,grid_panel也會被重新繪製!這絕對沒有效率。
我認爲這是由於JLayeredPane渴望的繪畫行爲。有沒有辦法在JLayeredPane中禁用此功能?
在你有興趣看到上面的效果的情況下,我寫了一個小的演示程序:
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);
}
});
}
}
我敢肯定,你將無法從昂貴,如果繪製也許雙緩衝你的層次解決這個問題分開。這一切都歸結於RepaintManager,它跟蹤「髒」區域,因爲這些圖層共享相同的屏幕空間,重新繪製一個會觸發重新繪製另一個...祝您好運。 – Adam 2012-03-08 21:51:43
所以有一種方法讓JPanel緩存它應該繪製的內容(當然,繪製的內容應該是靜態的),並讓repaint()只繪製緩存,而不是一次又一次地進行所有這些計算? – stackoverflower 2012-03-08 22:00:01
hehehe在調整太大,太可怕的閃爍+1時,必須有另一個問題,但你能夠使用[JLayer(自Java7)](http://stackoverflow.com/a/9272534/714968)或'JXLayer對於Java6)' – mKorbel 2012-03-08 22:07:11