2014-09-11 2 views
3

Chaque fois que je définis une icône pour mon JButton, il n'est toujours pas dimensionné correctement. Comment puis-je redimensionner l'icône pour l'adapter complètement au bouton?Icône de redimensionnement pour tenir sur JButton en Java?

final JButton btnSanic = new JButton(); 
Image img = icon.getImage(); 
Image newimg = img.getScaledInstance(width, height, java.awt.Image.SCALE_SMOOTH); 
icon = new ImageIcon(newimg); 
btnSanic.setIcon(icon); 
+0

Montrez-nous comment vous le faites maintenant et ce qui est incorrect à ce sujet. –

+0

J'ai essayé ceci: Image img = icon.getImage(); Image newimg = img.getScaledInstance (largeur, hauteur, java.awt.Image.SCALE_SMOOTH); icon = new ImageIcon (newimg); mais je ne sais pas vraiment quoi remplacer "l'icône" dans "Image img = icon.getImage();" – Arman

+0

Collez le contenu de votre commentaire dans votre message (cliquez sur 'edit') et formatez-le. –

Répondre

10

Il existe un certain nombre de problèmes. Pour commencer, tous les composants Swing NE PAS mettre à l'échelle automatiquement les images. Bien sûr, peut-être une bonne idée, mais étant donné le temps et le traitement nécessaires pour le faire efficacement, je comprends pourquoi ils ne le font pas, donc vous devez faire tout le travail ...

Vous devriez également vous rappeler, que la taille d'un composant n'est pas déterminée tant qu'il n'est pas mis en page et que vous pouvez fournir tous les conseils de dimensionnement que vous souhaitez, le gestionnaire de disposition est tout à fait en droit d'ignorer un ou plusieurs de ces indices.

Au lieu de « l'espoir » que vous connaissez la taille du bouton, vous devez utiliser l'API ComponentListener pour recevoir des notifications de lorsque le composant est en fait redimensionnée ...

Auto resizable icon

import java.awt.Dimension; 
import java.awt.EventQueue; 
import java.awt.Image; 
import java.awt.Insets; 
import java.awt.event.ComponentAdapter; 
import java.awt.event.ComponentEvent; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class TestButton { 

    public static void main(String[] args) { 
     new TestButton(); 
    } 

    private BufferedImage master; 

    public TestButton() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
        ex.printStackTrace(); 
       } 

       try { 
        master = ImageIO.read(new File("C:\\svg\\Revert 256x256.png")); 

        JButton btn = new JButton() { 

         @Override 
         public Dimension getPreferredSize() { 
          return new Dimension(90, 50); 
         } 

        }; 
        btn.addComponentListener(new ComponentAdapter() { 

         @Override 
         public void componentResized(ComponentEvent e) { 
          JButton btn = (JButton) e.getComponent(); 
          Dimension size = btn.getSize(); 
          Insets insets = btn.getInsets(); 
          size.width -= insets.left + insets.right; 
          size.height -= insets.top + insets.bottom; 
          if (size.width > size.height) { 
           size.width = -1; 
          } else { 
           size.height = -1; 
          } 
          Image scaled = master.getScaledInstance(size.width, size.height, java.awt.Image.SCALE_SMOOTH); 
          btn.setIcon(new ImageIcon(scaled)); 
         } 

        }); 

        JFrame frame = new JFrame("Testing"); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        frame.add(btn); 
        frame.pack(); 
        frame.setLocationRelativeTo(null); 
        frame.setVisible(true); 
       } catch (IOException exp) { 
        exp.printStackTrace(); 
       } 
      } 
     }); 
    } 

} 

Remarque: Cet exemple est loin d'être optimisé, mais fournit simplement un large concept d'une solution possible ...

Maintenant, un mot d'avertissement. Image#getScaledInstance est ni le plus rapide ou le plus grand des algorithmes d'échelle ...

Jetez un oeil à ...

pour plus de détails ...

1

Vous pouvez utiliser le Stretch Icon. Ajoutez simplement l'icône à votre composant et la mise à l'échelle se fera automatiquement.

Questions connexes