Изменение размера значка для JButton в Java?
Всякий раз, когда я устанавливаю значок для своего JButton, он всегда не имеет правильного размера. Как resize значка, чтобы он полностью соответствовал кнопке?
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);
- Центр JDialog над родителем
- Поддерживает ли Swing поддержку файлов в стиле Windows 7?
- Проблемы с методом Paint в Java, смехотворная скорость обновления
- Повернуть прямоугольник Java Graphics2D?
- Сохранение графического изображения Java 2d как .png-файла
Существует множество проблем. Для начала все компоненты Swing НЕ автоматизируют изображения. Конечно, может быть, хорошая идея, но учитывая количество времени и обработки, необходимые для эффективного использования, я понимаю, почему они этого не делают, поэтому вам нужно сделать всю работу …
Вы также должны помнить, что размер компонента не определяется до тех пор, пока он не будет выложен, и, хотя вы можете предоставить все подсказки для калибровки, которые могут вам понравиться, менеджер компоновки находится в пределах своих прав игнорировать один или несколько из этих советов.
Вместо того, чтобы «надеяться», вы знаете размер кнопки, вы должны использовать API-интерфейс ComponentListener
для получения уведомлений о том, когда компонент фактически изменяется …
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(); } } }); } }
Примечание. Этот пример далек от оптимизации, но просто предоставляет широкую концепцию возможного решения …
Теперь слово предупреждения. Image#getScaledInstance
является ни самым быстрым, ни лучшим алгоритмом масштабирования …
Взгляни на…
- Опасности Image.getScaledInstance ()
- Качество изображения после изменения размера очень низкое – Java
Больше подробностей…
Вы можете использовать значок Stretch . Просто добавьте значок в свой компонент, и масштабирование произойдет автоматически.