web-dev-qa-db-fra.com

Taille Java ImageIcon

J'ai téléchargé une image dans mon interface graphique qui s'affiche sur un JLabel. La dimension de l'étiquette n'est définie que sur 100 100, tandis que l'image est beaucoup plus grande. Ainsi, lorsque je la télécharge dans l'étiquette, elle se développe.

Est-il possible de le redimensionner automatiquement à la taille de l'étiquette?

Ci-dessous est l'écouteur d'action pour le téléversement d'image JButton

class UploadHandler implements ActionListener 
{
    public void actionPerformed(ActionEvent e)
    {
        int returnVal = fc.showOpenDialog(frame2);
        file = fc.getSelectedFile();
        pathname = file.getPath();
        icon = new ImageIcon(pathname);
        lblDisPic.setIcon(icon);    
    }
}

btnUpload = new JButton("Upload Picture");
lblDisPic = new JLabel();
lblDisPic.setBorder(raisedetched);
lblDisPic.setPreferredSize(d); 

btnUpload.addActionListener(new UploadHandler());
15
sutoL

À l'aide de l'exemple de code, une approche consiste à redimensionner l'image à afficher sur la variable JLabel avant que la méthode setIcon ne soit appelée.

Une solution pourrait être de changer la méthode actionPerformed pour que l'image soit chargée à partir du fichier spécifié, en utilisant ImageIO.read pour lire l'image, puis en le redimensionnant avant la création d'une ImageIcon.

Image img = ImageIO.read(fc.getSelectedFile());

Ensuite, l'image chargée peut être redimensionnée à la dimension de la variable JLabel à l'aide de Image.getScaledInstance .

Image resizedImage = 
    img.getScaledInstance(lblDisPic.getWidth(), lblDisPic.getHeight(), null);

Maintenant, on pourrait créer une ImageIcon à utiliser sur la JLabel.

lblDisPic.setIcon(new ImageIcon(resizedImage));

La limite de cette méthode est que, si la variable JLabel est redimensionnée de quelque manière que ce soit, l'image contenue par la variable JLabel ne sera pas redimensionnée. Cependant, étant donné que la JLabel utilisera une image réduite de l'original, cela signifierait que la quantité de mémoire nécessaire serait réduite (si tel était le cas) et que l'image originale ne devrait pas être redimensionnée à chaque image. affiché, comme ce serait le cas avec le remplacement de la méthode paintComponent

La méthode privilégiée pour réaliser la tâche à accomplir dépendra des exigences de savoir si l’image originale sera nécessaire ultérieurement ou non.

25
coobird

Bien sûr, il suffit de remplacer la méthode paintComponent pour que vous puissiez la redimensionner et la peindre à votre guise.

myLabel = new JLabel (/*whatever*/) {

    @Override
    public void paintComponent (Graphics g) {
        super.paintComponent (g);
        g.drawImage (myImageIcon.getImage(), 0, 0, getWidth (), getHeight (), null);
    }
};

Source de ici .

EDIT

Pour ajouter à votre changement de code:

lblDisPic = new JLabel();

À:

lblDidPic = new JLabel() {

    @Override
    public void paintComponent (Graphics g) {
        super.paintComponent (g);
        if (icon != null) {
            g.drawImage (icon.getImage(), 0, 0, getWidth(), getHeight(), null);
        }
    }
};
5
Pool

Vous pouvez remplacer la méthode paintIcon sur l'icône elle-même - 

ImageIcon icon = new ImageIcon(...) {

    @Override
    public void paintIcon( Component c, Graphics g, int x, int y ) {
        g.drawImage(getImage(), x, y, c.getWidth(), c.getHeight(), c);
    }

    @Override 
    public int getIconHeight() {
        // see below...
    }

    @Override
    public int getIconWidth() {
        // see below...
    }

};

Modifier - 

J'ai réalisé que la taille originale de l'image était prise en compte lorsque l'étiquette décidait où placer l'emplacement x, y de l'icône. Vous devrez également redéfinir les méthodes getIconWidth () et getIconHeight (). 

Cependant, il n'existe pas de moyen efficace de les remplacer pour renvoyer la taille de l'étiquette, car il n'y a aucune référence au composant lui-même dans ces méthodes. 

Une approche consisterait à créer une nouvelle classe qui étend la variable ImageIcon et à transmettre le composant. Ce n'est pas un très bon choix, car cela rompt l'aspect "réutilisable entre plusieurs composants" d'une icône.

Une autre solution consisterait simplement à remplacer ces méthodes dans la classe interne comme ci-dessus, mais à placer une référence codée en dur au composant sous forme de champ objet ou de variable locale final. Encore une fois, cela rompt l’aspect "réutilisable entre plusieurs composants" et semble un peu "hacky" en général, mais comme il s’agit d’une classe interne unique, cela pourrait être autorisé.

2
Nate

Si vous pouvez modifier l'image dans Paint, définissez sa taille en conséquence, puis cliquez sur Enregistrer pour que la même taille d'image apparaisse dans votre application Java.

1
Tushar Arora
private void jButton1ActionPerformed(Java.awt.event.ActionEvent evt) {                                         

JFileChooser jFileChooser1=new JFileChooser();

int state = jFileChooser1.showOpenDialog(new JFrame());         
       jTextField1.setText("");

           if( state ==JFileChooser.APPROVE_OPTION) {
      JOptionPane.showMessageDialog(
                    null,null);
         File file = jFileChooser1.getSelectedFile();
         s2=file.toString();
          jTextField1.setText(s2);
       jLabel1=new JLabel();
     jLabel1.setName(s2);
  jLabel1.setLocation(50,50);
  jLabel1.setSize(300,300);
    add(jLabel1);

    BufferedImage bi1;

    try
    {   
        bi1=ImageIO.read(file);
        ImageIcon icon1=new ImageIcon(bi1);
        jLabel1.setIcon(icon1);
        Image img = ImageIO.read(jFileChooser1.getSelectedFile());

        Image resizedImage = 
   img.getScaledInstance(jLabel1.getWidth(), jLabel1.getHeight(),Image.SCALE_DEFAULT);
       jLabel1.setIcon(new ImageIcon(resizedImage)); 


  jLabel1.setBorder(BorderFactory.createLineBorder(Color.RED,5));


       pack();   

    }
    catch(Exception e)
    {
  System.out.println(e);
    }


    }
    else if(state == JFileChooser.CANCEL_OPTION) {
      JOptionPane.showMessageDialog(
                  new JFrame(), "Canceled");
    }
  pack();           

  }
0
Rohit