调整图标以适应Java中的JButton?
每当我为JButton设置一个图标时,它的大小总是不正确。 我怎样才能调整图标,以适应button完全?
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组件都不会自动缩放图像。 当然,也许是一个好主意,但是考虑到有效地完成这项工作所需要的时间和处理量,我明白他们为什么不这样做,所以你需要做所有的工作。
您还应该记住,组件的大小只有在布局之后才能确定,并且您可以提供所有您可能喜欢的大小提示,但布局pipe理器完全有权忽略这些提示中的一个或多个。
而不是“希望”你知道button的大小,你应该使用ComponentListener
API来接收组件实际resize的通知。
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(); } } }); } }
注意:这个例子还没有经过优化,只是提供了一个可能解决scheme的广泛概念。
现在,一个警告的话。 Image#getScaledInstance
既不是最快或最大的缩放algorithm…
看一眼…
- Image.getScaledInstance()的风险
- resize后的图像质量很低 – Java
更多细节…
您可以使用拉伸图标 。 只需将图标添加到组件中,缩放将自动进行。