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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top