Te recomendamos que revises esta solución en un entorno controlado antes de enviarlo a producción, saludos.
Solución:
Vocación setOpaque(false)
en la parte superior JPanel
Deberia trabajar.
Por su comentario, parece que la pintura de Swing puede estar rota en alguna parte:
Primero, probablemente quería anular paintComponent()
en vez de paint()
en el componente que tengas paint()
anulado en.
Segundo: cuando anulas paintComponent()
primero querrás llamar super.paintComponent()
primero en hacer todas las cosas predeterminadas de pintura Swing (de las cuales honrar setOpaque()
es uno).
Ejemplo –
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class TwoPanels
public static void main(String[] args)
JPanel p = new JPanel();
// setting layout to null so we can make panels overlap
p.setLayout(null);
CirclePanel topPanel = new CirclePanel();
// drawing should be in blue
topPanel.setForeground(Color.blue);
// background should be black, except it's not opaque, so
// background will not be drawn
topPanel.setBackground(Color.black);
// set opaque to false - background not drawn
topPanel.setOpaque(false);
topPanel.setBounds(50, 50, 100, 100);
// add topPanel - components paint in order added,
// so add topPanel first
p.add(topPanel);
CirclePanel bottomPanel = new CirclePanel();
// drawing in green
bottomPanel.setForeground(Color.green);
// background in cyan
bottomPanel.setBackground(Color.cyan);
// and it will show this time, because opaque is true
bottomPanel.setOpaque(true);
bottomPanel.setBounds(30, 30, 100, 100);
// add bottomPanel last...
p.add(bottomPanel);
// frame handling code...
JFrame f = new JFrame("Two Panels");
f.setContentPane(p);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(300, 300);
f.setLocationRelativeTo(null);
f.setVisible(true);
// Panel with a circle drawn on it.
private static class CirclePanel extends JPanel
// This is Swing, so override paint*Component* - not paint
protected void paintComponent(Graphics g)
// call super.paintComponent to get default Swing
// painting behavior (opaque honored, etc.)
super.paintComponent(g);
int x = 10;
int y = 10;
int width = getWidth() - 20;
int height = getHeight() - 20;
g.drawArc(x, y, width, height, 0, 360);
Alternativamente, considere el panel de vidriodiscutido en el artículo Cómo usar los paneles raíz. Puede dibujar su contenido de “Características” en el panel de vidrio paintComponent()
método.
Anexo: Trabajando con GlassPaneDemo, agregué una imagen:
//Set up the content pane, where the "main GUI" lives.
frame.add(changeButton, BorderLayout.SOUTH);
frame.add(new JLabel(new ImageIcon("img.jpg")), BorderLayout.CENTER);
y alteró el panel de vidrio paintComponent()
método:
protected void paintComponent(Graphics g)
if (point != null)
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, 0.3f));
g2d.setColor(Color.yellow);
g2d.fillOval(point.x, point.y, 120, 60);
Como se indica aquí, los componentes de Swing deben respetar la propiedad opaca; en esta variación, la ImageIcon
llena por completo el BorderLayout.CENTER
del diseño predeterminado del marco.
En mi caso particular fue más fácil hacer esto:
panel.setOpaque(true);
panel.setBackground(new Color(0,0,0,0,)): // any color with alpha 0 (in this case the color is black
Aquí puedes ver las reseñas y valoraciones de los lectores
Acuérdate de que tienes la capacidad de añadir un diagnóstico verdadero si encontraste tu contratiempo a tiempo.