2009-09-23 12 views

Respuesta

20

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

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

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

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

(. Por encima de código no ha sido probado)

El siguiente código se podría utilizar para añadir el JPanelWithBackground en un JFrame:

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

En este ejemplo, el 012 El métodose usó para leer en el archivo JPEG externo.

+1

Esto no responde del todo la pregunta. Pone una imagen de fondo en un panel, pero luego solo inserta el panel en el diseño normal. La pregunta era cómo establecer un fondo en un marco detrás de otros componentes. – Boann

+0

¿Causaría problemas si le diera 'null' como su ImageObserver? – georgiaboy82

1

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

No he encontrado que esta técnica funcione correctamente. La imagen a veces dibuja sobre los componentes secundarios, o a veces queda cubierta por el fondo normal del marco cuando no debería. – Boann

+0

Sí, esto no funciona con componentes secundarios. –

5

Esto se hace fácilmente mediante la sustitución de 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 a BorderLayout para que coincida con el diseño de panel de contenido predeterminado.

(Si tiene alguna dificultad para ver la imagen, es posible que tenga que llamar setOpaque(false) en algunos otros componentes de manera que se puede ver hasta el fondo.)

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

si está utilizando NetBeans puede agregar una jlabel al marco y a través de las propiedades cambia su ícono a su imagen y elimina el texto. luego mueva el jlabel a la parte inferior del Jframe o cualquier panel de contenido a través del navegador

Cuestiones relacionadas