2011-08-01 14 views
8

Tengo un JPanel con una función paintComponent(). Lo llamaré una vez, y cuando el usuario haga clic en un JButton diferente, estableceré un indicador y quiero volver a llamar a esta función, ya que hará algo ligeramente diferente una vez que se establezca el indicador.JPanel Desinfección y repintado de gráficos?

Así que esto es lo que me pregunto: ¿cómo borrar las cosas existentes de paintComponent? Y para volver a dibujar, ¿acabo de llamar al paintComponent nuevamente?

Actualmente estoy tratando de lo siguiente:

flag2 = true; 
repaint(); //I expect (want) paintComponent to be called again 

En el componente de pintura, hago cosas como:

if (flag2==true) { 
    g.drawRect(...); 
} else { 
    g.drawLine(...); 
} 

Pero a través de las pruebas parece que hay algo malo en lo que soy obra.

Gracias por cualquier ayuda.

+0

No llama a repintado() desde el método paintComponent, ¿verdad? ¿Está seguro de que la llamada a repintado() está asociada con el panel que desea actualizar? (por ejemplo, myPanel.repaint())? –

Respuesta

14

Cuando se cambia una propiedad del panel, entonces usted necesita para invocar:

panel.repaint(); 

para hacer que el componente que se va a pintar.

A continuación, la primera instrucción en el método paintComponent() debería ser:

super.paintComponent(g); 

Esto va a pintar el fondo lo que ahora puede hacer su pintura personalizada.

Si necesita más ayuda, publique su SSCCE que demuestra el problema.

2

En primer lugar, ¿por qué no utilizar una enumeración en lugar de un booleano?

enum Enum { 
    RECTANGLE, 
    LINE, 
    CIRCLE 
} 

Enum choice = RECTANGLE; //default to RECTANGLE 

switch(choice) { 
    // case RECTANGLE, LINE, CIRCLE 
} 

Con respecto a su problema, ¿puede responder a mis comentarios en su pregunta?

+0

La lógica que tengo está bien, probablemente podría usar enum, pero cualquiera que sea ese no es mi problema. Mi problema es que necesito borrar todos los gráficos dibujados y luego llamar de nuevo a paintComponent para este JPanel. – JDS

+0

No debería necesitar borrar todos los gráficos para lograr lo que desea. –

+0

Vea la respuesta de Camickr, si no está haciendo lo que describió, concéntrese en eso primero. –

2

Sugeriría llamar revalidate(); en lugar de repintar(). revalidate() necesita ser llamado cuando se cambia el tamaño/diseño o cuando se agregan/eliminan objetos en su jpanel y se actualizarán todos sus elementos secundarios. Por lo que puedo decir, todavía estás usando el mismo objeto de pintura pero cambiando su diseño.