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?
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.
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.)
L'entrée Panneau de fond indique différentes manières selon vos besoins.
Vous pouvez soit créer une sous-classe du composant
http://www.jguru.com/faq/view.jsp?EID=9691
Ou tripoter des emballages
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.
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);
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
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);
}
};
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();
}
}