Redimensionando o ícone para caber no JButton em Java?

Sempre que eu definir um ícone para o meu JButton, ele não será dimensionado corretamente. Como posso resize o ícone para ajustar o botão completamente?

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); 

Existem vários problemas. Para começar, todos os componentes do Swing NÃO dimensionam automaticamente as imagens. Claro, pode ser uma boa idéia, mas dada a quantidade de tempo e processamento necessários para fazê-lo de forma eficiente, eu entendo porque não, então você precisa fazer todo o trabalho …

Você também deve lembrar que o tamanho de um componente não é determinado até que ele seja definido e, embora seja possível fornecer todas as dicas de dimensionamento que você possa gostar, o gerenciador de layout tem o direito de ignorar uma ou mais dessas dicas.

Em vez de “esperar” você sabe o tamanho do botão, você deve fazer uso da API ComponentListener para receber notifications de quando o componente é realmente redimensionado …

Ícone de redimensionamento automático

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

Nota: Este exemplo está longe de ser otimizado, mas simplesmente fornece um amplo conceito de uma possível solução …

Agora, uma palavra de aviso. Image#getScaledInstance não é o mais rápido ou o maior dos algoritmos de escalonamento …

Dê uma olhada …

  • Os perigos de Image.getScaledInstance ()
  • Qualidade de imagem após redimensionamento muito baixo – Java

para mais detalhes…

Você pode usar o ícone Stretch . Basta adicionar o ícone ao seu componente e o dimensionamento ocorrerá automaticamente.