web-dev-qa-db-fra.com

Comment définir une image comme arrière-plan pour Frame in Swing GUI of java?

J'ai créé une interface graphique en utilisant Swing of Java. Je dois maintenant définir une image sample.jpeg comme arrière-plan de l'image sur laquelle j'ai placé mes composants.Comment faire cela?

12
om.

Il n'y a pas de concept d '"image d'arrière-plan" dans une JPanel , il faudrait donc écrire sa propre façon de mettre en oeuvre une telle fonctionnalité.

Un moyen d'y parvenir serait de remplacer la méthode paintComponent pour dessiner une image d'arrière-plan chaque fois que la JPanel est actualisée.

Par exemple, on sous-classe JPanel, on ajoute un champ pour contenir l'image d'arrière-plan et on substitue la méthode 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);
  }
}

(Le code ci-dessus n'a pas été testé.)

Le code suivant pourrait être utilisé pour ajouter la JPanelWithBackground dans une JFrame:

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

Dans cet exemple, la méthode ImageIO.read(File) a été utilisée pour lire le fichier JPEG externe.

21
coobird

Cela se fait facilement en remplaçant le volet de contenu du cadre par un JPanel qui dessine votre image:

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

Cet exemple définit également la disposition du panneau sur BorderLayout pour correspondre à la disposition du volet de contenu par défaut.

(Si vous ne parvenez pas à visualiser l'image, vous devrez peut-être appeler setOpaque(false) sur d'autres composants pour pouvoir voir en arrière-plan.)

5
Boann

L'entrée Panneau de fond indique différentes manières selon vos besoins.

3
camickr
2
UberAlex

Le moyen le plus simple serait peut-être d'ajouter une image, de la redimensionner et de la définir sur JFrame/JPanel (dans mon cas, JPanel), mais n'oubliez pas de l'ajouter au conteneur uniquement après avoir ajouté les autres composants enfants.  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);
1
Ankit Sharma

si vous utilisez netbeans, vous pouvez ajouter un jlabel au cadre et modifier les icônes à l'aide de son icône pour qu'il supprime le texte. déplacez ensuite le jlabel vers le bas de l'image Jframe ou de tout volet de contenu via le navigateur 

1
ThilinaMD

Voici une autre approche rapide sans utiliser de panneau supplémentaire.

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);
  }
};
1
xrath
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
dhaval joshi