web-dev-qa-db-fra.com

Image d'arrière-plan JFrame

Je crée une interface graphique, bien que simple, et je veux qu'une image d'arrière-plan (2048 X 2048) remplisse toute la fenêtre et un carré dans le coin supérieur gauche où l'image occasionnelle 64 X 64 peut être chargée. Merci à l'avance à tous ceux qui aident :) Edit: Je sais déjà comment faire du JFrame une taille définie, c'est le chargement de l'image dont j'ai besoin d'aide.

12
Aaron

Voici un exemple simple pour ajouter l'image d'arrière-plan dans un JFrame:

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();
    }
} 
  • Cliquez ici pour plus d'informations
16
Nambi

La meilleure façon de charger une image est via l'API ImageIO

BufferedImage img = ImageIO.read(new File("/path/to/some/image"));

Il existe plusieurs façons de rendre une image à l'écran.

Vous pouvez utiliser un JLabel. C'est la méthode la plus simple si vous ne voulez pas modifier l'image de toute façon ...

JLabel background = new JLabel(new ImageIcon(img));

Ajoutez-le simplement à votre fenêtre comme bon vous semble. Si vous devez y ajouter des composants, vous pouvez simplement définir le gestionnaire de disposition de l'étiquette sur tout ce dont vous avez besoin et ajouter vos composants.

Cependant, si vous avez besoin de quelque chose de plus sophistiqué, si vous avez besoin de changer l'image d'une manière ou d'une autre ou si vous souhaitez appliquer des effets supplémentaires, vous devrez peut-être utiliser une peinture personnalisée.

Premier cavert: ne jamais peindre directement sur un conteneur de niveau supérieur (comme JFrame). Les conteneurs de niveau supérieur ne sont pas à double tampon, vous pouvez donc vous retrouver avec un clignotement entre les repeints, d'autres objets vivent sur la fenêtre, donc changer son processus de peinture est gênant et peut causer d'autres problèmes et les cadres ont des bordures qui sont rendues à l'intérieur de la zone visible de la fenêtre ...

Au lieu de cela, créez un composant personnalisé, s'étendant à partir de quelque chose comme JPanel. Remplacez sa méthode paintComponent et restituez-y votre sortie, par exemple ...

protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(img, 0, 0, this);
}

Jetez un œil à Exécution de peinture personnalisée et Graphiques 2D pour plus de détails

12
MadProgrammer

J'ai utilisé une méthode très similaire à @bott, mais je l'ai modifiée un peu pour ne pas avoir à redimensionner l'image:

BufferedImage img = null;
try {
    img = ImageIO.read(new File("image.jpg"));
} catch (IOException e) {
    e.printStackTrace();
}
Image dimg = img.getScaledInstance(800, 508, Image.SCALE_SMOOTH);
ImageIcon imageIcon = new ImageIcon(dimg);
setContentPane(new JLabel(imageIcon));

Fonctionne à chaque fois. Vous pouvez également obtenir la largeur et la hauteur du jFrame et l'utiliser à la place du 800 et du 508 respectivement.

5
Riccorbypro

Tu peux faire:

setContentPane(new JLabel(new ImageIcon("resources/taverna.jpg")));

À la première ligne du constructeur de la classe Jframe, cela fonctionne bien pour moi

2
bott