Изменение размера значка для 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); 

Существует множество проблем. Для начала все компоненты 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 . Просто добавьте значок в свой компонент, и масштабирование произойдет автоматически.

  • Использование шаблона наблюдателя в дизайне GUI JavaFX
  • Как изменить форму вкладки JTabbedPane?
  • Какое правильное действие при закрытии окон в java / swing?
  • Конечная локальная переменная не может быть назначена
  • JProgressBar не прогрессирует
  • Java-swing прослушивает действие в текстовом поле формы
  • Javafx: Разница между javafx.concurent и Platform.runLater?
  • Главная Тема против UI Thread в Java
  • Поворотная квадратная панель в Java GUI
  • Почему я не должен называть setVisible (true) перед добавлением компонентов?
  • Как сделать прямоугольник перемещаться по экрану с помощью привязок клавиш?
  • Давайте будем гением компьютера.