java swing icons jbutton

¿Cambiar el tamaño del icono para que se ajuste a JButton en Java?



swing icons (3)

Cada vez que configuro un icono para mi JButton, no siempre tiene el tamaño correcto. ¿Cómo puedo cambiar el tamaño del icono para que se ajuste completamente al botón?

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


En este código, una imagen cambia de tamaño para tener las mismas dimensiones del objeto JButton que la contendrá:

JButton button = new JButton(); button.setBounds(x, y, width, height); try{ Image image = ImageIO.read(new File("icons/myImage.png")).getScaledInstance(width, height, Image.SCALE_DEFAULT); button.setIcon(new ImageIcon(image)); } catch (Exception e) { }


Hay cualquier número de problemas. Para empezar, todos los componentes Swing NO escalan automáticamente las imágenes. Claro, podría ser una buena idea, pero dada la cantidad de tiempo y procesamiento necesarios para hacerlo de manera eficiente, entiendo por qué no lo hacen, por lo que debe hacer todo el trabajo ...

También debe recordar que el tamaño de un componente no se determina hasta que se presenta, y si bien puede proporcionar todas las sugerencias de tamaño que desee, el administrador de diseño tiene el derecho de ignorar una o más de estas sugerencias.

En lugar de "esperar" que conozca el tamaño del botón, debe hacer uso de la API ComponentListener para recibir notificaciones de cuándo se cambia el tamaño del componente ...

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 ejemplo está lejos de estar optimizado, pero simplemente proporciona un concepto amplio de una posible solución ...

Ahora, una palabra de advertencia. Image#getScaledInstance no es el algoritmo de escala más rápido ni el más grande ...

Echa un vistazo a...

para más detalles...


Puede usar el ícono Estirar . Simplemente agregue el icono a su componente y la escala se realizará automáticamente.