组件调整大小的方法被连续调用?

时间:2018-06-07 09:57:02

标签: java swing

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。但仍然没有我调整任何连续调用的东西。

1 个答案:

答案 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()));