sirve - poner background en java
¿Cómo establecer un fondo transparente de JPanel? (6)
Alternativamente, considere The Glass Pane , discutido en el artículo Cómo usar Root Panes . Puede dibujar su contenido "Característica" en el método paintComponent()
del panel de vidrio.
Adición: 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 método paintComponent()
del panel de vidrio:
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);
}
}
¿ JPanel
puede JPanel
el fondo de JPanel
como transparente?
Mi marco tiene dos JPanel
s:
- Panel de imágenes y
- Panel de funciones .
El panel de funciones se superpone al panel de imágenes . El Panel de imágenes funciona como fondo y carga imágenes desde una URL remota.
En el panel de funciones , quiero dibujar formas. Ahora el panel de imagen no se puede ver debido al color de fondo del panel de funciones.
Necesito hacer transparente el fondo del panel de funciones mientras sigo dibujando sus formas y quiero que el panel de imágenes esté visible (ya que está haciendo la función de mosaico y caché de las imágenes).
Estoy usando dos JPanel
, porque necesito separar la imagen y el dibujo de la forma.
¿Hay alguna manera de que el Jpanel superpuesto tenga un fondo transparente?
Como mostró correctamente en su respuesta, la mejor manera es usar paintComponent, pero también si el caso es tener un JPanel semi transparente (o cualquier otro componente, realmente) y tener algo no transparente dentro. También debe anular el método paintChildren y establecer el valor alfa en 1. En mi caso, extendí el JPanel así:
public class TransparentJPanel extends JPanel {
private float panelAlfa;
private float childrenAlfa;
public TransparentJPanel(float panelAlfa, float childrenAlfa) {
this.panelAlfa = panelAlfa;
this.childrenAlfa = childrenAlfa;
}
@Override
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(getBackground());
g2d.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, panelAlfa));
super.paintComponent(g2d);
}
@Override
protected void paintChildren(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(getBackground());
g2d.setRenderingHint(
RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_ATOP, childrenAlfa));
super.paintChildren(g);
}
//getter and setter
}
Y en mi proyecto solo necesito crear Jpanel jp = new TransparentJPanel(0.3f, 1.0f);
instancia de Jpanel jp = new TransparentJPanel(0.3f, 1.0f);
, si solo quiero el Jpanel transparente. También podría desordenar la forma de JPanel usando g2d.fillRoundRect
y g2d.drawRoundRect
, pero no está dentro del alcance de esta pregunta.
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
Llamar a setOpaque(false)
en el JPanel
superior debería funcionar.
De tu comentario, suena como que la pintura Swing puede estar rota en alguna parte,
En primer lugar, es probable que desee anular paintComponent()
lugar de paint()
en cualquier componente que tenga paint()
anulado.
Segundo: cuando anula paintComponent()
, primero debe llamar a super.paintComponent()
para hacer todo el trabajo de pintura Swing predeterminado (de los cuales honrar a 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);
}
}
}
public void paintComponent (Graphics g)
{
((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,0.0f)); // draw transparent background
super.paintComponent(g);
((Graphics2D) g).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER,1.0f)); // turn on opacity
g.setColor(Color.RED);
g.fillRect(20, 20, 500, 300);
}
He intentado hacerlo de esta manera, pero es muy flickery
(Feature Panel).setOpaque(false);
Espero que esto ayude.