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());
À 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.
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);
}
}
};
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é.
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.
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();
}