Estoy escribiendo una aplicación que tiene un JLayeredPane (llámalo capas) que contiene dos JPanels en capas diferentes. Anulo el método paintComponent del JPanel en la parte inferior (llámalo grid_panel) para que dibuje una grilla, y el método paintComponent del que está en la parte superior (llámalo circuit_panel) para que dibuje un circuito.JLayeredPane y pintura
He aquí un resumen de la estructura:
layers -
|-circuit_panel (on top)
|-grid_panel (at bottom)
Quiero que el grid_panel para permanecer estático, es decir, no hacer ningún retoque (excepto la inicial), ya que no cambia.
El problema es, cada vez que llamo circuit_panel.repaint(), grid_panel se vuelve a pintar también! Esto definitivamente no es eficiente.
Creo que esto se debe al comportamiento de pintura impaciente de JLayeredPane. ¿Hay alguna manera de desactivar esta característica en JLayeredPane?
En caso de que esté interesado en ver el efecto anterior, he escrito un pequeño programa de demostración:
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);
}
});
}
}
estoy bastante seguro de que no será capaz de evitar esto, aparte de tal Doblebuffering sus capas si es caro para dibujar. Todo se reduce a RepaintManager, que realiza un seguimiento de las regiones "sucias", porque las capas comparten el mismo espacio en la pantalla y el repinte de una activará el repintado de otra ... Buena suerte. – Adam
Entonces, ¿hay alguna manera de que un JPanel guarde en caché lo que debe pintar (por supuesto, lo que está pintado debe ser estático), y deje que repinta() simplemente dibuje el caché, en lugar de hacer todos esos cálculos una y otra vez? – stackoverflower
jejeje en el cambio de tamaño también, con terrible parpadeo +1, debe haber otro problema, pero ¿es capaz de utilizar [JLayer (desde Java7)] (http://stackoverflow.com/a/9272534/714968) o 'JXLayer (para Java6) ' – mKorbel