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

Java 如何在更改JLabel的大小时动态缩放图像,java,swing,jframe,jlabel,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); lab

我已将图像读入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));
addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                addScaledImage(); // executes the lines above 
            }
        });
我正在使用提供的GroupLayout,并将水平轴和垂直轴设置为“自动调整大小”(通过设计视图),以便无论何时更改窗口大小,JLabel的大小都会自动调整为JFrame的大小

现在我想将图像的大小与JLabel的大小一起调整,这里开始出现问题。我添加了一个事件处理程序,它响应如下调整JFrame的大小:

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));
addComponentListener(new ComponentAdapter() {
            @Override
            public void componentResized(ComponentEvent e) {
                addScaledImage(); // executes the lines above 
            }
        });
这在理论上是可行的,但速度非常慢。因此,我尝试将事件处理程序添加到JLabel而不是JFrame,但这导致了另一个问题:映像一直在扩展,没有执行任何操作。然后,我用一个JScrollPane包围了JLabel,并将事件处理程序添加到JScrollPane中。只要我扩展JFrame的大小,它就可以工作。但是,当我减小窗口大小时,图像的大小并没有减小,而是保持不变

  • 是否有一种更优雅的方式来集成事件处理程序(可能没有JScrollPane的帮助)

  • 如何使我的图像/JLabel与任何调整大小事件一起自动调整大小(增加和减少JFrame的大小)?另一种方法(如另一位布局经理)是否更适合这种情况

  • 另外,如果我想保持图像的高宽比,是否有一种指定的缩放方法

  • 我想将图像的大小与JLabel的大小一起调整

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

    然后我用一个JScrollPane包围了JLabel

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

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

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

    我不会使用IDE来生成布局代码,也不会使用GroupLayout,因为对于这样简单的东西来说,它太复杂了


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

    可能的复制下半部分也提供了一种稍微优化的缩放方法-它减少了执行缩放操作的次数-这是昂贵的”,当我减小窗口大小时,图像的大小并没有减小,而是保持不变”-好的,有很多可能的问题,但最有可能的是,
    JScrollPane
    preferredSize
    可能阻止布局管理器挤压“组件”Hi MadProgrammer。感谢您提供一些链接,帮助我更好地理解这个问题!