我已将图像读取到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的大小,此方法就起作用。但是,当我减小窗口大小时,图像不会减小,而是保持不变。
是否有一种更优雅的方式来集成事件处理程序(也许不需要JScrollPane的帮助)?
如何使我的图像/ JLabel与任何调整大小事件一起自动调整大小(增加和减小JFrame的大小)?另一种方法(例如,另一种LayoutManager)也许更适合吗?
此外,如果我想保持图像的高宽比,是否有为此指定的缩放方法?
答案 0 :(得分:1)
我想调整图像的大小以及JLabel的大小
您可以使用Stretch Icon。更改标签尺寸时,它将自动缩放。适用于任何可以显示图标的组件。
然后我用JScrollPane包围了JLabel
但是,当我减小窗口尺寸时,图像不会减小,而是保持不变
您不应该使用JScrollPane。滚动窗格缩小时,添加到滚动窗格的组件的大小不会更改。而是显示滚动条。
我正在使用提供的GroupLayout并将水平轴和垂直轴设置为“自动调整大小”
我不会使用IDE来生成布局代码,也不会使用GroupLayout,因为它对于这种简单的操作而言过于复杂。
只需将标签(使用StretchIcon)添加到框架。默认情况下,框架使用BorderLayout,它将自动调整添加到BorderLayout CENTER的所有组件的大小。