所以我刚刚开始学习 Java(有一些 C++ 经验),但遇到了一些麻烦。我从未创建过 GUI,所以我现在正在尝试它,同时学习 Java。我现在遇到的问题是,我无法找到一种方法如何在不损失质量的情况下使用 JLabel 添加图像。我尝试过的每一种方法,使用 Graphics 2D、Thumbnailator、BufferedImage 都会得到相同的结果。感觉图像失去了原始图像的清晰度。
我一直在寻找解决方案,我确实这样做了,但其中大多数都非常古老或非常难以理解。所以,我寻求帮助,如果可以的话,请像我五岁一样向我解释一下。
这就是我现在导入图像的方法,因为它似乎是最简单的方法。
ImageIcon logo = new
ImageIcon(this.getClass().getResource("logo.png"));
logoLabel.setIcon(logo);
logoLabel.setPreferredSize(new Dimension(logo.getIconWidth(),
logo.getIconHeight()));
但我确信还有其他方法。感谢您提前的帮助。
我使用的是 Windows 11 Home 22H2,使用 IntelliJ Community Edition 232.10203.10 和 Java 11.0.20
完整代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class GUI implements ActionListener {
private int count = 0;
private JLabel label;
private JFrame frame;
private JPanel panel;
private JButton button;
public GUI() {
frame = new JFrame();
button = new JButton("Click me");
label = new JLabel("Number of clicks: 0");
panel = new JPanel();
JLabel logoLabel = new JLabel();
ImageIcon logo = new ImageIcon(this.getClass().getResource("logo.png"));
Dimension buttonDim = new Dimension(100, 40);
logoLabel.setIcon(logo);
button.addActionListener(this);
button.setPreferredSize(buttonDim);
panel.setBorder(BorderFactory.createEmptyBorder(30, 30, 10, 30));
panel.add(button);
panel.add(label);
panel.add(logoLabel);
frame.setSize(1100, 900);
frame.add(panel, BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("Our GUI");
frame.setVisible(true);
}
public static void main(String[] args) {
new GUI();
}
@Override
public void actionPerformed(ActionEvent e) {
count++;
label.setText("Number of clicks: " + count);
}
}
原图:
我在 GUI 中得到了什么
我不会调整它的大小或任何东西。
所以,问题实际上出在我自己的系统上。由于我使用的是带有 QHD 屏幕的笔记本电脑,以 100% 缩放比例使用它不太舒服,因此我将其设置为 125%。这就是导致问题的原因。解决方案是向 IDE 添加 VM 选项
-Dsun.java2d.uiScale=1.0
这对我有用。感谢大家提供有关如何解决问题的想法!