una sirve que poner para imagen fondo como color java swing graphics background jpanel

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

imagen http://i41.tinypic.com/2j0mlv9.png

¿ 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.