首页 > 解决方案 > 组件调整大小的方法被连续调用?

问题描述

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);
    }
}

嗨每个人都可以解释为什么组件调整大小方法被连续调用?什么是错误?据我了解,只有在调整按钮大小时才应调用组件调整大小。但仍然没有我调整任何被连续调用的东西。

标签: javaswing

解决方案


老实说,我不完全理解发生了什么以及为什么会发生,您需要自己进一步调查,但这与按钮的首选大小有关。

按钮的首选大小受多种因素的影响,例如添加到的容器、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()));

推荐阅读