java swing background jpanel setbackground

java - JPanel setBackground(Color.BACK) no hace nada



swing (6)

Acabo de probar una implementación escueta y simplemente 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; } }

Tengo el siguiente JPanel personalizado y lo he añadido a mi marco usando el constructor de GUI de Netbeans, ¡pero el fondo no cambiará! Puedo ver el círculo, dibujando con g.fillOval (). ¿Qué pasa?

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; } }


Necesita crear un nuevo objeto Jpanel en el constructor de la Junta. por ejemplo

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


Para establecer completamente el fondo a un color dado:

1) establecer primero el color de fondo

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

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

Otra sugerencia útil: si desea dibujar PERO NO en una zona específica (algo así como una máscara o un "agujero"), llame al método setClip () de los gráficos con la forma de "agujero" (cualquier forma) y luego llame al Método Clear () (el fondo debe 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 encontré ningún método para uniones o inversiones de zonas de clip, solo intersecciones, muy mal ...

Espero eso ayude


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


Tienes que llamar al super.paintComponent(); también, para permitir que la API de Java dibuje 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()); }


setOpaque(false);

Cambiado a

setOpaque(true);