更改JLabel的大小时如何动态缩放图像

时间:2018-08-14 19:09:41

标签: java swing jframe jlabel

我已将图像读取到JLabel中,并将图像缩放为JLabel的大小,如下所示:

File file = new File ("C:/Users/Me/Desktop/TestImages/test.jpg");
BufferedImage image = ImageIO.read(file);

Image scaledImage = image.getScaledInstance(label.getWidth(), label.getHeight(), Image.SCALE_SMOOTH);
label.setIcon(new ImageIcon(scaledImage));

我正在使用提供的 GroupLayout 并将水平轴和垂直轴设置为“自动调整大小”(通过“设计”视图),以便JLabel的大小自动调整为每当更改窗口大小时,都会使用JFrame。

现在,我想同时调整图像的大小和JLabel的大小,这会造成麻烦。我添加了一个事件处理程序,该事件处理程序可以像这样调整JFrame的大小:

addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                addScaledImage(); // executes the lines above 
            }
        });

这在理论上可行,但是非常慢。因此,我尝试将事件处理程序添加到JLabel而不是JFrame中,但这导致了另一个问题:图像在不执行任何操作的情况下一直在扩展。然后,我用JScrollPane包围了JLabel,并将事件处理程序添加到JScrollPane中。只要我扩展JFrame的大小,此方法就起作用。但是,当我减小窗口大小时,图像不会减小,而是保持不变。

  1. 是否有一种更优雅的方式来集成事件处理程序(也许不需要JScrollPane的帮助)?

  2. 如何使我的图像/ JLabel与任何调整大小事件一起自动调整大小(增加和减小JFrame的大小)?另一种方法(例如,另一种LayoutManager)也许更适合吗?

  3. 此外,如果我想保持图像的高宽比,是否有为此指定的缩放方法?

1 个答案:

答案 0 :(得分:1)

  

我想调整图像的大小以及JLabel的大小

您可以使用Stretch Icon。更改标签尺寸时,它将自动缩放。适用于任何可以显示图标的组件。

  

然后我用JScrollPane包围了JLabel

     

但是,当我减小窗口尺寸时,图像不会减小,而是保持不变

您不应该使用JScrollPane。滚动窗格缩小时,添加到滚动窗格的组件的大小不会更改。而是显示滚动条。

  

我正在使用提供的GroupLayout并将水平轴和垂直轴设置为“自动调整大小”

我不会使用IDE来生成布局代码,也不会使用GroupLayout,因为它对于这种简单的操作而言过于复杂。

只需将标签(使用StretchIcon)添加到框架。默认情况下,框架使用BorderLayout,它将自动调整添加到BorderLayout CENTER的所有组件的大小。