Repintar problema con JPanel dentro de otro JPanel
Pregunta
Estoy dibujando formas dentro de este JPanel
, que también está dentro de otro JPanel
principal. En repaint()
sólo dibuja las formas de una milésima de segundo y luego desaparecen. Ellos no permanecen pintadas, ¿por qué?
Mi método paintComponent
es algo como esto
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < reportElements.size(); i++) {
this.reportElements.get(i).display((Graphics2D) pageComponents.get(i).getGraphics());
}
}
Cuando el padre es un JEditorPane
con setEditable()
activado, funciona y podemos ver las formas, pero cuando se trata de un JPanel
, después de una milésima de segundo todo lo que veo es paneles vacíos.
Solución
En este caso lo que ocurre con los pageComponents, los pequeños JPanels? los Panel padre no va a llamar la formas en ellos es?
No estoy seguro de que undertand su comentario. Su panel principal debe contener paneles niño. Los paneles niño deben ser añadidos al panel principal utilizando un controlador de distribución. Luego, cuando oscilación decide volver a pintar el panel principal, sino que también repintar todos los paneles hijos ya su vez los paneles niño va a pintar allí formas.
Por lo que se aproxima a su valor de Custom Painting tiene un ejemplo de trabajo de dibujar formas en un panel.
Otros consejos
se debe pintar con el objeto Graphics del JPanel para que sea permanente ... En su ejemplo, que es el Graphics g
...
ultrajohn ha muerto en. Es necesario utilizar el Graphics
se le ha pasado. Siga leyendo para conocer el por qué ...
Java 1.6 introdujo el RepaintManager
que apoya la optimización de las solicitudes de redibujado. Tiene algunos efectos sutiles en la pintura.
En este caso, se trabaja con varios objetos Graphics2D: la g
pasó a paintComponent
y el valor devuelto por la llamada getGraphics
El director de repintado se ha entregado g
en el que pintar. Nota:. Esto no pinta en la pantalla, sino en un buffer temporal (suponiendo que el doble buffer por defecto)
En el paintComponent
llama se está pintando a los gráficos obtenidos de getGraphics
de los diversos componentes. Esto está dejando de lado el gerente pintar y pintar directamente a la pantalla sin búfer.
Cuando vuelve paintChildren
, la RepaintManager
entra en acción para manejar la actualización del doble buffer. Se pinta el buffer temporal en blanco sobre el búfer mostrado, borrando así lo fue pintado a través de los objeto gráfico obtenido de getGraphics
Puede ser que paintChildren
o paintBorder
sobregiros lo que ha dibujado en su método. Tal vez intente anular paint
lugar. Allí usted tiene control total sobre lo que va a ser pintado en el componente, y usted puede decidir si se debe llamar más paintComponent
, paintChildren
o paintBorder
en absoluto.