web-dev-qa-db-fra.com

Ajout d'image à JFrame

J'utilise donc Eclipse avec Windows Builder. Je me demandais si je pouvais quand même importer une image qui apparaîtra sur le cadre JFrame et que je pourrai facilement déplacer et redimensionner au lieu de définir l'emplacement et la taille et de les dessiner.

9
user2612619

Il n'y a pas de composant image spécialisé fourni dans Swing (ce qui est triste à mon avis). Donc, il y a quelques options:

  1. Comme @Reimeus a dit: Utilisez un JLabel avec une icône.
  2. Créez dans le constructeur de fenêtre un JPanel, qui représentera l'emplacement de l'image. Ajoutez ensuite votre propre composant d’image personnalisé au JPanel à l’aide de quelques lignes de code que vous ne devrez jamais modifier. Ils devraient ressembler à ceci:

    JImageComponent ic = new JImageComponent(myImageGoesHere);
    imagePanel.add(ic);
    

    où JImageComponent est une classe créée par vous-même qui étend JComponent et qui remplace la méthode paintComponent() pour dessiner l'image.

14
Martijn Courteaux

Voici un exemple simple d’ajout d’une image à une JFrame:

frame.add(new JLabel(new ImageIcon("Path/To/Your/Image.png")));
18
Rollyng

Si vous utilisez Netbeans pour développer, utilisez jLabel et changez sa propriété icon. 

2
rishad2m8

Comme l'a dit martijn-courteaux, créer un composant personnalisé est la meilleure option ..__ En C #, il existe un composant appelé PictureBox et j'ai essayé de créer ce composant pour Java, voici le code:

import Java.awt.Dimension;
import Java.awt.Graphics;
import Java.awt.Image;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JComponent;

public class JPictureBox extends JComponent {

    private Icon icon = null;
    private final Dimension dimension = new Dimension(100, 100);
    private Image image = null;
    private ImageIcon ii = null;
    private SizeMode sizeMode = SizeMode.STRETCH;
    private int newHeight, newWidth, originalHeight, originalWidth;

    public JPictureBox() {
        JPictureBox.this.setPreferredSize(dimension);
        JPictureBox.this.setOpaque(false);
        JPictureBox.this.setSizeMode(SizeMode.STRETCH);
    }

    @Override
    public void paintComponent(Graphics g) {
        if (ii != null) {
            switch (getSizeMode()) {
                case NORMAL:
                    g.drawImage(image, 0, 0, ii.getIconWidth(), ii.getIconHeight(), null);
                    break;
                case ZOOM:
                    aspectRatio();
                    g.drawImage(image, 0, 0, newWidth, newHeight, null);
                    break;
                case STRETCH:
                    g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null);
                    break;
                case CENTER:
                    g.drawImage(image, (int) (this.getWidth() / 2) - (int) (ii.getIconWidth() / 2), (int) (this.getHeight() / 2) - (int) (ii.getIconHeight() / 2), ii.getIconWidth(), ii.getIconHeight(), null);
                    break;
                default:
                    g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), null);
            }
        }
    }

    public Icon getIcon() {
        return icon;
    }

    public void setIcon(Icon icon) {
        this.icon = icon;
        ii = (ImageIcon) icon;
        image = ii.getImage();
        originalHeight = ii.getIconHeight();
        originalWidth = ii.getIconWidth();
    }

    public SizeMode getSizeMode() {
        return sizeMode;
    }

    public void setSizeMode(SizeMode sizeMode) {
        this.sizeMode = sizeMode;
    }

    public enum SizeMode {
        NORMAL,
        STRETCH,
        CENTER,
        ZOOM
    }

    private void aspectRatio() {
        if (ii != null) {
            newHeight = this.getHeight();
            newWidth = (originalWidth * newHeight) / originalHeight;
        }
    }

}

Si vous voulez ajouter une image, choisissez la JPictureBox, puis allez dans Propriétés et trouvez la propriété "icon", puis sélectionnez une image . Pour trouver la propriété "sizeMode", vous pouvez choisir certaines valeurs:

  • Valeur NORMAL, l’image est positionnée dans le coin supérieur gauche de la JPictureBox.
  • La valeur STRETCH provoque l’étirement ou la réduction de l’image pour s’adapter à la JPictureBox.
  • La valeur ZOOM provoque l’extension ou la réduction de l’image pour s’adapter à la JPictureBox; toutefois, le rapport de format de l'original est conservé.
  • La valeur CENTER permet de centrer l'image dans la zone client. 

Si vous voulez en savoir plus sur ce sujet, vous pouvez vérifier ceci video .

Aussi, vous pouvez voir le code sur Gitlab ou Github .

0
ricardo130