Estoy haciendo un juego para la clase y para este juego tengo una variedad de JButtons que necesitan poder cambiar los colores en función de ciertos factores. Tenía todo esto resuelto y estaba cambiando el color con setBackground (Color) pero ahora estoy tratando de cambiar las formas de los botones y aún puedo cambiar los colores. Mi código actual es:

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class CircleButton extends JButton {

  Graphics g = this.getGraphics();

  public CircleButton(){
    super();
    setContentAreaFilled(false);
  }

  protected void paintComponent(Graphics g) {
   g.setColor(Color.pink);
   g.fillOval(0, 0, getSize().width-1, getSize().height-1);
   super.paintComponent(g);
}

  public void changeColor(Color c) {
    g.setColor(Color.blue);
    g.fillOval(0, 0, getSize().width-1, getSize().height-1);
    super.paintComponent(g);
  }                        
}

Cuando cambio mi otro código para usar este en lugar de JButton, funciona y comienzo con una cuadrícula de círculos rosados ​​de 8x8, que es lo que quiero. Pero ahora no puedo cambiar de color. Intenté agregar el método changeColor como mostré arriba, pero obtengo una nullPointerException cuando llega a la línea 20 (g.setColor (Color.blue)). Creo que el problema es cómo estoy usando Graphics, pero no puedo identificar la solución específica. ¿Alguien tiene alguna sugerencia?

3
Breathtender 21 nov. 2011 a las 02:36
1
Noooo .... ¡nunca usas component.getGraphics en Swing!
 – 
kleopatra
21 nov. 2011 a las 13:37

1 respuesta

La mejor respuesta

El único método que se supone que debe llamarse para pintar su componente personalizado es paintComponent ().

Dentro de esos métodos, siempre está configurando el color rosa, y este es un problema.

El otro problema es que está intentando pintar su componente dentro del método changeColor. Esto está mal. Deje que esa función solo cambie una variable que indique el color.

Supongo que estás buscando algo como esto:

import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
public class CircleButton extends JButton {

 // Graphics g = this.getGraphics();
 Color col = Color.pink;
  public CircleButton(){
   //commented as unuseful.. super call is implicit if constructor has no arguments
   // super();
    setContentAreaFilled(false);
  }

  protected void paintComponent(Graphics g) {
   g.setColor(this.color);
   g.fillOval(0, 0, getSize().width-1, getSize().height-1);
   super.paintComponent(g);
}

  public void changeColor(Color c) {
      this.color = Color.blue; //only change the color. Let paintComponent paint
      this.repaint();
  }                        
}
3
Heisenbug 21 nov. 2011 a las 14:51
Pero entonces, ¿cómo hago para que cambie realmente el color? Cambia la variable de color. "this.color" devuelve un error de que no puede encontrar el color de la variable, así que intenté complementar eso con col, pero todo lo que hace es cambiar la variable, pero esa variable no se usa hasta que llamo a paintComponent. Sin embargo, no sé cómo llamar a paintComponent porque no estoy seguro de qué usar en los parámetros. EDITAR: No importa, lo arreglé. El color funcionó, solo olvidé cambiarlo en paintComponent a (this.color). ¡Muchas gracias por su ayuda!
 – 
Breathtender
21 nov. 2011 a las 05:26
Ups, pensé que estaba hecho, pero estaba equivocado. Prácticamente funciona, pero solo actualiza el color cuando paso el mouse sobre el círculo. ¿Alguien sabe alguna forma de actualizarlo tan pronto como cambie el color? @Heisenbug
 – 
Breathtender
21 nov. 2011 a las 05:58
Y una vez más pude arreglarlo. Solo tenía que agregar "repaint ();" a mi método changeColor. Estoy bastante seguro de que ya terminé con esta parte de mi código. De nuevo muchas gracias.
 – 
Breathtender
21 nov. 2011 a las 06:06
Debe llamar al menos a repaint () después de configurar el color: el botón subyacente no conoce esa nueva propiedad.
 – 
kleopatra
21 nov. 2011 a las 13:36
@kleopatra: sí ... gracias ... Olvidé la llamada al método repintado. Recién arreglado.
 – 
Heisenbug
21 nov. 2011 a las 14:51