java - 组件调整大小的方法被连续调用?
问题描述
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);
}
}
嗨每个人都可以解释为什么组件调整大小方法被连续调用?什么是错误?据我了解,只有在调整按钮大小时才应调用组件调整大小。但仍然没有我调整任何被连续调用的东西。
解决方案
老实说,我不完全理解发生了什么以及为什么会发生,您需要自己进一步调查,但这与按钮的首选大小有关。
按钮的首选大小受多种因素的影响,例如添加到的容器、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()));
推荐阅读
- java - 有没有办法在 IntelliJ 中获取数据库选项卡?
- .net - 尝试创建实例时没有合适的构造函数
- swift - SwiftUI Initialzier 要求 String 符合 Identifiable
- python - Python 排除行正则表达式字符串等(python 日志记录/Ookla 服务器
- flutter - 如何转换列表
列出 ? - sql - PLSQL - 帮助我的正则表达式电话号码和区号
- python - 如何在词干和删除标点符号后按新行拆分正则表达式结果列表?
- javascript - 无法使用 puppeteer 单击按钮
- javascript - Vue.JS 的通用排序方法存在问题
- python - python 函数中的变量需要“self”吗?