如何在更改 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 的大小(?另一种方法(例如另一种布局管理器(可能更适合此吗?

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

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

您可以使用拉伸图标。当标签大小更改时,它将自动缩放。适用于任何可以显示图标的组件。

然后我用JScrollPane包围了JLabel。

但是,当我减小窗口大小时,图像的大小并没有减小,而是保持不变

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

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

我不会使用 IDE 来生成布局代码,也不会使用 GroupLayout,因为对于这么简单的事情来说,它过于复杂。

只需将标签(使用拉伸图标(添加到框架中即可。默认情况下,框架使用边框布局,该布局将自动调整添加到边框布局中心的组件的大小。

最新更新