¿Cómo establecer una imagen como fondo para Frame en Swing GUI of java?

Creé una GUI usando Swing of Java. Ahora tengo que establecer una imagen sample.jpeg como fondo del fotogtwig en el que puse mis componentes. ¿Cómo hacer eso?

No existe el concepto de una “imagen de fondo” en un JPanel , por lo que uno debería escribir su propio camino para implementar dicha función.

Una forma de lograr esto sería anular el método paintComponent para dibujar una imagen de fondo cada vez que se JPanel el JPanel .

Por ejemplo, uno podría subclasificar un JPanel y agregar un campo para mantener la imagen de fondo, y anular el método paintComponent :

 public class JPanelWithBackground extends JPanel { private Image backgroundImage; // Some code to initialize the background image. // Here, we use the constructor to load the image. This // can vary depending on the use case of the panel. public JPanelWithBackground(String fileName) throws IOException { backgroundImage = ImageIO.read(new File(fileName)); } public void paintComponent(Graphics g) { super.paintComponent(g); // Draw the background image. g.drawImage(backgroundImage, 0, 0, this); } } 

(El código anterior no ha sido probado).

El siguiente código podría usarse para agregar JPanelWithBackground en un JFrame :

 JFrame f = new JFrame(); f.getContentPane().add(new JPanelWithBackground("sample.jpeg")); 

En este ejemplo, se utilizó el método ImageIO.read(File) para leer en el archivo JPEG externo.

Esto se hace fácilmente al reemplazar el panel de contenido del marco con un JPanel que dibuja su imagen:

 try { final Image backgroundImage = javax.imageio.ImageIO.read(new File(...)); setContentPane(new JPanel(new BorderLayout()) { @Override public void paintComponent(Graphics g) { g.drawImage(backgroundImage, 0, 0, null); } }); } catch (IOException e) { throw new RuntimeException(e); } 

Este ejemplo también establece el diseño del panel en BorderLayout para que coincida con el diseño del panel de contenido predeterminado.

(Si tiene problemas para ver la imagen, puede necesitar llamar a setOpaque(false) en algunos otros componentes para que pueda ver el fondo).

La entrada del panel de fondo muestra un par de formas diferentes según sus requisitos.

Aquí hay otro enfoque rápido sin usar panel adicional.

 JFrame f = new JFrame("stackoverflow") { private Image backgroundImage = ImageIO.read(new File("background.jpg")); public void paint( Graphics g ) { super.paint(g); g.drawImage(backgroundImage, 0, 0, null); } }; 

Si está utilizando netbeans, puede agregar un jlabel al marco y, a través de las propiedades, cambiar su ícono a su imagen y eliminar el texto. luego mueva el jlabel a la parte inferior del Jframe o cualquier panel de contenido a través del navegador

Quizás la forma más fácil sería agregar una imagen, escalarla y configurarla en JFrame / JPanel (en mi caso JPanel), pero recuerde “agregarla” al contenedor solo después de haber agregado los otros componentes secundarios. enter image description here

  ImageIcon background=new ImageIcon("D:\\FeedbackSystem\\src\\images\\background.jpg"); Image img=background.getImage(); Image temp=img.getScaledInstance(500,600,Image.SCALE_SMOOTH); background=new ImageIcon(temp); JLabel back=new JLabel(background); back.setLayout(null); back.setBounds(0,0,500,600); 
 import javax.swing.*; import java.awt.*; import java.awt.event.*; class BackgroundImageJFrame extends JFrame { JButton b1; JLabel l1; public BackgroundImageJFrame() { setTitle("Background Color for JFrame"); setSize(400,400); setLocationRelativeTo(null); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); /* One way -----------------*/ setLayout(new BorderLayout()); JLabel background=new JLabel(new ImageIcon("C:\\Users\\Computer\\Downloads\\colorful design.png")); add(background); background.setLayout(new FlowLayout()); l1=new JLabel("Here is a button"); b1=new JButton("I am a button"); background.add(l1); background.add(b1); // Another way setLayout(new BorderLayout()); setContentPane(new JLabel(new ImageIcon("C:\\Users\\Computer\\Downloads \\colorful design.png"))); setLayout(new FlowLayout()); l1=new JLabel("Here is a button"); b1=new JButton("I am a button"); add(l1); add(b1); // Just for refresh :) Not optional! setSize(399,399); setSize(400,400); } public static void main(String args[]) { new BackgroundImageJFrame(); } }