web-dev-qa-db-fra.com

Le moyen le plus simple de définir l'image comme arrière-plan JPanel

Comment pourrais-je ajouter l'image d'arrière-plan à mon JPanel sans créer une nouvelle classe ou méthode, mais simplement en l'insérant avec le reste des attributs de JPanel?

J'essaie de définir le fond d'un JPanel en utilisant une image. Cependant, chaque exemple que je trouve semble suggérer d'étendre le panneau avec sa propre classe.

Je cherchais un moyen d'ajouter simplement l'image sans créer une toute nouvelle classe et avec la même méthode (en essayant de garder les choses organisées et simples).

Voici un exemple de la méthode qui définit mon JPanel:

public static JPanel drawGamePanel(){
    //Create game panel and attributes
    JPanel gamePanel = new JPanel();
    Image background = Toolkit.getDefaultToolkit().createImage("Background.png");
    gamePanel.drawImage(background, 0, 0, null);
    //Set Return
    return gamePanel;
}
16
Joshua Martin

J'essaie de définir le fond d'un JPanel en utilisant une image. Cependant, chaque exemple que je trouve semble suggérer d'étendre le panneau avec sa propre classe.

oui, vous devrez étendre JPanel et remplacer la fonction paintcomponent(Graphics g) pour le faire.

@Override
  protected void paintComponent(Graphics g) {

    super.paintComponent(g);
        g.drawImage(bgImage, 0, 0, null);
}

Je cherchais un moyen d’ajouter simplement l’image sans créer une nouvelle classe et avec la même méthode () en essayant de garder les choses organisées et simples ).

Vous pouvez utiliser un autre composant permettant d’ajouter une image directement sous forme d’icône, par exemple. JLabel si vous voulez.

ImageIcon icon = new ImageIcon(imgURL); 
JLabel thumb = new JLabel();
thumb.setIcon(icon);

Mais encore une fois dans la parenthèse essayant de garder les choses organisées et simples !! Qu'est-ce qui vous fait penser que la création d'une nouvelle classe vous mènera dans un monde en désordre?

26
Sage

Le moyen le plus simple de définir l'image comme arrière-plan JPanel

N'utilisez pas de JPanel. Utilisez simplement un JLabel avec une icône pour ne pas avoir besoin de code personnalisé.

Voir Panneau de fond pour plus d'informations ainsi qu'une solution pour peindre l'image sur un JPanel avec 3 options de peinture différentes:

  1. escaladé
  2. carrelé
  3. réel
15
camickr

Comme je le sais, vous pouvez le faire en écrasant la méthode paintComponent qui exige d’hériter JPanel

 @Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g); // Paint the background image and scale it to fill the entire space
    g.drawImage(/*....*/);
}

L’autre façon (un peu compliquée) de créer une seconde JPanel personnalisée et de la mettre est comme arrière-plan pour votre

ImagePanel

public class ImagePanel extends JPanel
{
private static final long serialVersionUID = 1L;
private Image image = null;
private int iWidth2;
private int iHeight2;

public ImagePanel(Image image)
{
    this.image = image;
    this.iWidth2 = image.getWidth(this)/2;
    this.iHeight2 = image.getHeight(this)/2;
}


public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    if (image != null)
    {
        int x = this.getParent().getWidth()/2 - iWidth2;
        int y = this.getParent().getHeight()/2 - iHeight2;
        g.drawImage(image,x,y,this);
    }
}
}

EmptyPanel

public class EmptyPanel extends JPanel{

private static final long serialVersionUID = 1L;

public EmptyPanel() {
    super();
    init();
}

@Override
public boolean isOptimizedDrawingEnabled() {
    return false;
}


public void init(){

    LayoutManager overlay = new OverlayLayout(this);
    this.setLayout(overlay);

    ImagePanel iPanel = new ImagePanel(new IconToImage(IconFactory.BG_CENTER).getImage());
    iPanel.setLayout(new BorderLayout());   
    this.add(iPanel);
    iPanel.setOpaque(false);                
}
}

IconToImage

public class IconToImage {

Icon icon;
Image image;


public IconToImage(Icon icon) {
    this.icon = icon;
    image = iconToImage();
}

public Image iconToImage() { 
    if (icon instanceof ImageIcon) { 
        return ((ImageIcon)icon).getImage(); 
    } else { 
        int w = icon.getIconWidth(); 
        int h = icon.getIconHeight(); 
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); 
        GraphicsDevice Gd = ge.getDefaultScreenDevice(); 
        GraphicsConfiguration gc = Gd.getDefaultConfiguration(); 
        BufferedImage image = gc.createCompatibleImage(w, h); 
        Graphics2D g = image.createGraphics(); 
        icon.paintIcon(null, g, 0, 0); 
        g.dispose(); 
        return image; 
    } 
}


/**
 * @return the image
 */
public Image getImage() {
    return image;
}
}
4
Maxim Shoustin

Dessinez l'image sur le fond d'un fichier JPanel ajouté au cadre. Utilisez un gestionnaire de disposition pour ajouter normalement vos boutons et d’autres composants au panneau. Si vous ajoutez d'autres panneaux enfants, vous souhaitez peut-être définir child.setOpaque (false).

import javax.imageio.ImageIO;
import javax.swing.*;
import Java.awt.*;
import Java.io.IOException;
import Java.net.URL;

public class BackgroundImageApp {
    private JFrame frame;

    private BackgroundImageApp create() {
        frame = createFrame();
        frame.getContentPane().add(createContent());

        return this;
    }

    private JFrame createFrame() {
        JFrame frame = new JFrame(getClass().getName());
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        return frame;
    }

    private void show() {
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private Component createContent() {
        final Image image = requestImage();

        JPanel panel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(image, 0, 0, null);
            }
        };

        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        for (String label : new String[]{"One", "Dois", "Drei", "Quatro", "Peace"}) {
            JButton button = new JButton(label);
            button.setAlignmentX(Component.CENTER_ALIGNMENT);
            panel.add(Box.createRigidArea(new Dimension(15, 15)));
            panel.add(button);
        }

        panel.setPreferredSize(new Dimension(500, 500));

        return panel;
    }

    private Image requestImage() {
        Image image = null;

        try {
            image = ImageIO.read(new URL("http://www.johnlennon.com/wp-content/themes/jl/images/home-gallery/2.jpg"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        return image;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new BackgroundImageApp().create().show();
            }
        });
    }
}
2
javajon