Java 如何在更改JLabel的大小时动态缩放图像
我已将图像读入JLabel并将图像缩放到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
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的大小,它就可以工作。但是,当我减小窗口大小时,图像的大小并没有减小,而是保持不变
只需添加标签(使用StretchIcon)到框架。默认情况下,框架使用BorderLayout,它将自动调整添加到BorderLayout中心的任何组件的大小。可能的复制下半部分也提供了一种稍微优化的缩放方法-它减少了执行缩放操作的次数-这是昂贵的”,当我减小窗口大小时,图像的大小并没有减小,而是保持不变”-好的,有很多可能的问题,但最有可能的是,
JScrollPane
的preferredSize
可能阻止布局管理器挤压“组件”Hi MadProgrammer。感谢您提供一些链接,帮助我更好地理解这个问题!