java - 缩放图像会在 java.awt.image.ReplicateScaleFilter 处产生错误。(来源不明))
问题描述
我正在尝试缩放图像以使其适合 JLabel 大小,但遇到此错误
at java.awt.image.ReplicateScaleFilter.<init>(Unknown Source)
at java.awt.image.AreaAveragingScaleFilter.<init>(Unknown Source)
at java.awt.Image.getScaledInstance(Unknown Source)
at ma.ensao.Practice.main(Practice.java:49)
这是我正在使用的整个代码
import java.util.*;
import java.io.IOException;
import java.io.*;
import javax.imageio.ImageIO;
import java.awt.image.*;
import java.awt.*;
import javax.swing.*;
public class Practice {
public static void main(String[] args) throws IOException{
BufferedImage img = null;
JLabel label=new JLabel();
try {
img = ImageIO.read(new File("med/mido.jpg"));
} catch (IOException e) {
e.printStackTrace();
}
Image imgS = img.getScaledInstance(label.getWidth(), label.getHeight(),
Image.SCALE_SMOOTH);
ImageIcon imageIcon = new ImageIcon(imgS);
label.setIcon(imageIcon);
JPanel p=new JPanel();
p.add(label);
JFrame f = new JFrame();
f.setSize(500,500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.add(p);
f.setVisible(true);
}
}
我想知道为什么我会收到这个错误?谢谢。
解决方案
JLabel label=new JLabel();
System.out.println( label.getSize() );
试试上面的代码。
我猜问题是标签的大小是 (0, 0),所以很难将图像缩放到那个大小。
相反,您应该选择您希望图像的大小,然后获取缩放的实例,然后使用缩放的图像创建标签。
编辑:
每当用户更改窗口的大小时,我想让图像的大小等于标签的大小,
因此,您希望图像的大小能够动态缩放。所以你不能只创建一个初始的缩放图像。
此外,您不能将 JLabel 添加到 JPanel,然后将面板添加到框架,因为 JPanel 的默认布局管理器是 FlowLayout,它将始终尊重标签的首选大小。
所以你有几个选择:
在 JPanel 上进行自定义绘画。在该方法中,您将使用JPanel的和方法
paintCompononent(...)
获取面板的当前大小。然后您将使用该类的方法来绘制图像。然后将此自定义面板直接添加到框架中,以允许面板动态调整大小。阅读有关自定义绘画的 Swing 教程以获取更多信息和工作示例以帮助您入门。getWidth()
getHeight()
drawImage(...)
Graphics
BorderLayout.CENTER
使用拉伸图标。这是一个允许图标动态调整大小的自定义类。因此,您将
JLabel
使用创建StretchIcon
然后将标签添加到BorderLayout.CENTER
框架的。
推荐阅读
- javascript - 如何使用 Paypal 为 Google Pay 执行授权 + 捕获流程?
- node.js - 类型“用户 []”.ts(2339) 上不存在属性“密码”
- javascript - 为什么我不能让这些卡片排成一行。他们不断地落入一列
- javascript - lodash groupBy 行为
- python - 删除异常值以通过箱线图计算系列/数据框的平均值?
- json - 在 Flutter 中创建 JSON 数组
- react-native - 应用程序后台运行时无法使任何传感器工作 [Expo (React-Native)]
- firebase-test-lab - 录制对话框中的 Postive Button Click 时,在 Android Studio 中录制 Robo 脚本会挂起
- list - 任意排序对象列表的相等性kotlin
- java - Connection with DB stuck spring boot jpa