【问题标题】:How to implement .png pics in a JFrame?如何在 JFrame 中实现 .png 图片?
【发布时间】:2015-08-31 11:19:41
【问题描述】:

您好,我想制作一个窗口、一个 GUI,并在其中放一张图片。

我看了一个 YT 教程 (https://www.youtube.com/watch?v=Ap20Qw77TzY) 并复制了所有类似的内容,但我制作的窗口根本没有图像。我尝试了不同的文件类型,如 .jpg 和不同的窗口大小,以匹配图片大小,但没有帮助。

这是我的代码,我没有收到真正的错误,除了以下警告:

The serializable class main does not declare a static final serialVersionUID field of type long,line 8

This method has a constructor,line 25

代码

package main;

import java.awt.Graphics;
import java.awt.Toolkit;

import javax.swing.*;

public class main extends JFrame {
/**
 * author jan
 */
public main(String title){
    super (title);
    
} 
  
public void paint(Graphics gr) {
    super.paint(gr);
    
    
    gr.drawImage(Toolkit.getDefaultToolkit().getImage("Koppenhagen\\Pictures\\Herz.png"), 0, 0, this);           
}


public static void main(String[] args) {
    
    main window = new main("Mein Test!");
    
    window.setSize(160,160);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setVisible(true);

}
}

【问题讨论】:

  • 您已经声明了两次main。另外,为什么要让一个名为main 的类成为JFrame 的子类?只需创建一个新项目并使用 JFrame 作为对象。您的代码不是面向对象的编程。
  • @Dimitris Sfounis 哦,是的,谢谢,我知道我不是面向对象编程的,但在我考虑之前我必须了解整个事情^^ 你有什么技巧可以解决我的实际问题吗? ^^

标签: java graphics jframe awt


【解决方案1】:
  1. Toolkit.getImage 上使用ImageIO.read,它会抛出一个IOException 的图像由于某种原因无法加载
  2. 检查图像的位置。您的示例是在Koppenhagen\\Pictures 中查找与程序执行上下文相关的文件。您可以使用File#exists 检查文件是否确实存在于您认为的位置
  3. 不要在任何 paint 方法中加载资源,加载图像可能需要一些时间,并且绘画应该尽可能快地运行
  4. 我不鼓励你覆盖像JFrame 这样的顶级容器的油漆。一个JFrame 包含一个JRootPane,其中包含一个contentPane,所有这些都可以独立于其父容器进行绘制。相反,从JPanel 开始并覆盖其paintComponent 方法,然后将其添加到JFrame 的实例中

【讨论】:

  • 非常感谢您的回答,一旦我理解了您的提示,我会尽力遵循您的提示^^。
  • 如果我们知道图像位置和您的代码之间的关系,那会有所帮助
  • 非常感谢!我尝试了 file.exists 并认为他找不到它所以我把它放在另一个文件夹中并在我的代码中使用了完整路径并知道它终于可以工作了^^谢谢你的帮助!!!!!!
  • 如果你能指定或解释我你的第四个答案会很有帮助:)
  • 注意:应用程序资源在部署时将成为嵌入式资源,因此明智的做法是立即开始访问它们。 embedded-resource 必须通过 URL 而不是文件访问。请参阅info. page for embedded resource 了解如何形成 URL。
【解决方案2】:

这是一个绘制图像的简单 Swing 应用程序。

您必须将图像与 Java 代码放在同一目录中。

package com.ggl.testing;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingUtilities;

public class DrawImage implements Runnable {

    @Override
    public void run() {
        JFrame frame = new JFrame("Image");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JScrollPane scrollPane = new JScrollPane(new ImagePanel(getImage()));
        frame.add(scrollPane);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private Image getImage() {
        try {
            return ImageIO.read(getClass().getResourceAsStream(
                    "StockMarket.png"));
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new DrawImage());
    }

    public class ImagePanel extends JPanel {

        private static final long serialVersionUID = -2668799915861031723L;

        private Image image;

        public ImagePanel(Image image) {
            this.image = image;
            this.setPreferredSize(new Dimension(image.getWidth(null), image
                    .getHeight(null)));
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, this);
        }

    }

}

【讨论】:

    猜你喜欢
    • 2013-01-18
    • 1970-01-01
    • 2022-01-01
    • 2012-04-04
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多