2012-04-13 16 views
9

Tengo el siguiente JPanel personalizado y lo he añadido a mi marco utilizando el constructor de la interfaz gráfica de usuario de Netbeans, ¡pero el fondo no cambiará! Puedo ver el círculo, dibujando con g.fillOval(). ¿Qué pasa?JPanel setBackground (Color.BACK) no hace nada

public class Board extends JPanel{ 

    private Player player; 

    public Board(){ 
     setOpaque(false); 
     setBackground(Color.BLACK); 
    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(Color.red); 
     g.fillOval(player.getxCenter(), player.getyCenter(), player.getRadius(), player.getRadius()); 
    } 

    public void updatePlayer(Player player){ 
     this.player=player; 
    } 
} 

Respuesta

14

Si su panel no es "opaco" (transparente) no verá el color de fondo.

+0

"El color de fondo se usa solo si el componente es opaco ..." - ['setBackground()'] (http://docs.oracle.com/javase/6/docs/api/ javax/swing/JComponent.html # setBackground% 28java.awt.Color% 29). – trashgod

+8

+1, OP está escribiendo 'setOpaque (falso)' y todavía espera que el color sea visible :( –

14

usted tiene que llamar la super.paintComponent(); así, para permitir que el API de Java dibujar el fondo original. El super se refiere al código original de JPanel.

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 

    g.setColor(Color.red); 
    g.fillOval(player.getxCenter(), player.getyCenter(), player.getRadius(), player.getRadius()); 
} 
+0

He intentado antes (encontrado tras Google), pero no resuelve el problema :( –

+0

No estoy seguro, pero creo que el panel debe ser opaco. –

+0

Lo he intentado también, sin cambios :) –

3

acabo intentaron una aplicación escueto y que sólo funciona:

public class Test { 

    public static void main(String[] args) { 
      JFrame frame = new JFrame("Hello"); 
      frame.setPreferredSize(new Dimension(200, 200)); 
      frame.add(new Board()); 
      frame.pack(); 
      frame.setVisible(true); 
    } 
} 

public class Board extends JPanel { 

    private Player player = new Player(); 

    public Board(){ 
     setBackground(Color.BLACK); 
    } 

    public void paintComponent(Graphics g){ 
     super.paintComponent(g); 
     g.setColor(Color.red); 
     g.fillOval(player.getCenter().x, player.getCenter().y, 
      player.getRadius(), player.getRadius()); 
    } 
} 

public class Player { 

    private Point center = new Point(50, 50); 

    public Point getCenter() { 
     return center; 
    } 

    private int radius = 10; 

    public int getRadius() { 
     return radius; 
    } 
} 
+0

Estoy trabajando en Netbeans, así que es difícil hacerlo de esta manera, pero sin embargo, he logrado crear mi Tablero manualmente() y lo agregué manualmente a mi Marco.Pensé que podría trabajar con mi placa con un constructor de GUI integrado, pero de esa manera no puedo cambiar el tamaño de este JPanel de la Junta (ni siquiera en el código, ya que está autogenerado y no puedo acceder a él). –

2

Es necesario crear un nuevo objeto JPanel en el constructor Junta. por ejemplo

public Board(){ 
    JPanel pane = new JPanel(); 
    pane.setBackground(Color.ORANGE);// sets the background to orange 
} 
3
setOpaque(false); 

cambiado a

setOpaque(true); 
+0

quizás pueda explicar en pocas palabras cuál es el problema con el código que tiene el póster y luego cuál es su solución. ¡Gracias! –

-1

el fin de establecer por completo el fondo a un color dado:

1) establecer primero el color de fondo

2) método de llamada "Borrar (0,0, this.getWidth)(), this.getHeight()) "(ancho y alto del área de pintura de componentes)

Creo que es el procedimiento básico para establecer el fondo ... He tenido el mismo problema.

Otra sugerencia útil: si quieres dibujar PERO NO en una zona específica (algo así como una máscara o un "agujero"), llama al método setClip() de los gráficos con la forma "agujero" (cualquier forma) y luego llame al método Clear() (el fondo debería establecerse previamente en el color "agujero").

Puede crear zonas de clip más complicadas llamando al método clip() (cuando lo desee) DESPUÉS de llamar al método setClip() para tener intersecciones de formas de recorte.

no he encontrado ningún método para uniones o inversiones de zonas en movimiento, sólo intersecciones, muy mal ...

creo que sirve

+0

Esta respuesta es muy vaga, va a temas aleatorios que no importan para OP, y el paso 2 ni siquiera compila, o tal vez lo hace, pero no hay un contexto dado para dicho método. Al menos, no existe como método miembro de JPanel o JFrame. Por favor, den más contexto y sean concisos en sus publicaciones. – kevr