【问题标题】:Java Swing image cut off/zoomedJava Swing 图像被截断/缩放
【发布时间】:2022-01-06 15:25:53
【问题描述】:

当我尝试在 Java Swing 中渲染 png 图像时,它会被截断/缩放。这是我的代码:

this.setSize(500, 500);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.getGraphics().drawImage(getImage("IMAGE PATH"), 0, 0, this);

这是我的getImage 函数

public static Image getImage(String path) {
        File file = new File(path);
        try {
             return ImageIO.read(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

我要渲染的图像是 500x500,就像我的框架一样,但它仍然出现错误。这也适用于我使用这样的功能:

Image image = getImage("Image Path");
assert image != null;
JLabel picLabel = new JLabel(new ImageIcon(image));

这是我尝试渲染的图像之一:

结果如下: 从这个例子中很难看出,但地面应该更低,树木更高。

【问题讨论】:

    标签: java image swing jframe javax.imageio


    【解决方案1】:

    不要设置框架的大小

    如果您的图像是 500x500,那么当框架还具有标题栏和边框时,您怎么能期望图像大小和框架大小相同?

    不要自定义绘画`

    改为:

    1. 使用 ImageIcon 创建 JLabel。
    2. 将标签添加到框架中
    3. 在使框架可见之前调用pack()

    所有组件都将获得适当的大小。

    阅读How to Use Labels 上的 Swing 教程以获取更多信息和示例。

    【讨论】:

      【解决方案2】:

      尽管@camikr 找到了解决方案,但我找到了一个更好的解决方案。

      我所做的是,我创建了一个新的 JPanel 并运行 setPreferredSize,其尺寸与我的 JFrame (500x500) 相同。然后我重写了paintComonent 函数,使用Graphics2D 类渲染图像。

      import javax.swing.*;
      import java.awt.*;
      import java.awt.event.ActionEvent;
      import java.util.Objects;
      
      public class MyPanel extends JPanel {
          public Image loadedImage = getImage("Image");
          public LoadState() {
              setPreferredSize(new Dimension(500,500));
          }
      
          @Override
          protected void paintComponent(Graphics g) {
              super.paintComponent(g);
              Graphics2D g2 = (Graphics2D) g.create();
              g2.drawImage(loadedImage, 0, 0, null);
              g2.dispose();
          }
      }
      
      

      编辑:修正@Harald K 的建议

      【讨论】:

      • 由于 getImage 涉及 I/O,因此从 paintComponent 方法调用它是一个非常糟糕的主意,因为每次重新绘制面板时都会一遍又一遍地加载图像,从而使您的应用程序感觉迟钝...相反,使用已加载的图像初始化您的面板,并覆盖getPreferredSize 以返回图像的尺寸以避免硬编码...或者只使用JLabel。 ?
      • 很高兴知道,我会在我的代码中更改它。
      猜你喜欢
      • 1970-01-01
      • 2015-03-14
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多