public class AddImage
{
public void adjustImageToButton(JButton btn,String imagePath) throws IOException{
Image master= ImageIO.read(new File(Thread.currentThread().getContextClassLoader().getResource(imagePath).getPath()));
btn.addComponentListener(new ComponentAdapter()
{
@Override
public void componentResized(ComponentEvent e)
{
super.componentResized(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;
}
//System.out.println("size.width"+size.width+"---->"+"size.height"+size.height);
Image scaled = master.getScaledInstance(size.width, size.height, Image.SCALE_SMOOTH);
btn.setIcon(new ImageIcon(scaled));
System.out.println("hellow");
}
});
btn.setBorderPainted(false);
btn.setFocusPainted(false);
btn.setContentAreaFilled(false);
}
}
public class Main
{
public static void main(String[] args) throws IOException
{
JButton button1 = new JButton();
JButton button2 = new JButton();
AddImage addImage = new AddImage();
JFrame frame = new JFrame();
addImage.adjustImageToButton(button1, "ArrowButton.png");
addImage.adjustImageToButton(button2, "uparrowbutton.png");
JPanel panel = new JPanel();
panel.add(button1);
panel.add(button2);
frame.add(panel);
frame.setSize(300, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
大家好,每个人都可以解释为什么连续调用组件调整大小的方法?这是什么错误?至于我的理解只有在按钮调整大小时才应调用Component resize。但仍然没有我调整任何连续调用的东西。
答案 0 :(得分:0)
说实话,我并不完全明白为什么以及为什么会发生这种情况,你需要自己进一步调查,但这与按钮的首选大小有关。
按钮的首选大小受多种因素的影响,例如添加到其中的容器,其LayoutManager
,按钮的图标/文本等等。
由于某种原因,按钮preferredSize()
略大于缩放图像。初始首选大小为34x10,但在设置图标后,它会更改为68x20,这会导致另一个大小调整。然后再次设置图像后的首选尺寸(此时图像尺寸调整为68x20),变为102x30,依此类推。首选尺寸总是比图像尺寸大34,高10。
我找到的解决方案是自己设置preferredSize
:
Image scaled = master.getScaledInstance(size.width, size.height, Image.SCALE_SMOOTH);
ImageIcon newIcon = new ImageIcon(scaled);
btn.setIcon(newIcon);
btn.setPreferredSize(new Dimension(newIcon.getIconWidth(), newIcon.getIconHeight()));