Java 如何在JFrame中实现.png图片?

Java 如何在JFrame中实现.png图片?,java,graphics,jframe,awt,Java,Graphics,Jframe,Awt,嗨,我想做一个窗口,一个图形用户界面,并把它的图像 我观看了YT教程()并复制了所有类似的内容,但我制作的窗口根本没有图像。我尝试了不同的文件类型,如.jpg和不同的窗口大小,匹配图片大小,但没有帮助 这是我的代码,我没有收到任何真正的错误,除了以下警告: The serializable class main does not declare a static final serialVersionUID field of type long,line 8 This method has a

嗨,我想做一个窗口,一个图形用户界面,并把它的图像

我观看了YT教程()并复制了所有类似的内容,但我制作的窗口根本没有图像。我尝试了不同的文件类型,如.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
代码
  • 使用
    ImageIO.read
    覆盖
    Toolkit.getImage
    ,它将抛出一个
    IOException
    ,因为某些原因无法加载图像
  • 检查图像的位置。您的示例是在
    Koppenhagen\\Pictures
    中查找与程序执行上下文相关的文件。您可以使用
    File#exists
    检查文件是否确实存在于您认为它所在的位置
  • 不要在any
    paint
    方法中加载资源,加载图像可能需要时间,绘制应该尽可能快地运行
  • 我不鼓励您覆盖顶级容器的油漆,如
    JFrame
    JFrame
    包含一个
    JRootPane
    ,其中包括一个
    contentPane
    ,所有这些都可以独立于其父容器进行绘制。相反,从一个
    JPanel
    开始,替代它的
    paintComponent
    方法,然后将其添加到
    JFrame
  • 使用
    ImageIO.read
    覆盖
    Toolkit.getImage
    ,它将抛出一个
    IOException
    ,因为某些原因无法加载图像
  • 检查图像的位置。您的示例是在
    Koppenhagen\\Pictures
    中查找与程序执行上下文相关的文件。您可以使用
    File#exists
    检查文件是否确实存在于您认为它所在的位置
  • 不要在any
    paint
    方法中加载资源,加载图像可能需要时间,绘制应该尽可能快地运行
  • 我不鼓励您覆盖顶级容器的油漆,如
    JFrame
    JFrame
    包含一个
    JRootPane
    ,其中包括一个
    contentPane
    ,所有这些都可以独立于其父容器进行绘制。相反,从一个
    JPanel
    开始,替代它的
    paintComponent
    方法,然后将其添加到
    JFrame

  • 下面是一个简单的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);
            }
    
        }
    
    }
    

    下面是一个简单的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);
            }
    
        }
    
    }
    

    您已经声明了两次
    main
    。另外,为什么要将名为
    main
    的类作为
    JFrame
    的子类?只需创建一个新项目并使用JFrame作为对象。你的代码不是面向对象的编程。@Dimitris Sfunis哦,是的,谢谢,我知道我不是面向对象的编程,但在我考虑这个问题之前,我必须了解整件事。^^你有什么建议来解决我的实际问题吗?^你试过ImageIcon吗?您已经声明了两次
    main
    。另外,为什么要将名为
    main
    的类作为
    JFrame
    的子类?只需创建一个新项目并使用JFrame作为对象。你的代码不是面向对象的编程。@Dimitris Sfunis哦,是的,谢谢,我知道我不是面向对象的编程,但在我考虑这个问题之前,我必须了解整件事。^^你有什么建议来解决我的实际问题吗?^你试过ImageIcon吗?非常感谢您的回答,一旦我理解了您的提示,我会尝试按照它们进行操作。如果我们知道图像位置和代码之间的关系,那将非常有帮助,谢谢!我试过file.exists,但他找不到,所以我把它放在另一个文件夹中,并使用了我代码中的完整路径,知道它终于起作用了^^^谢谢你的帮助!!!!!如果ypu可以指定或解释我,您的第四个答案id将得到很大帮助:)注意:应用程序资源将在部署时成为嵌入式资源,因此现在就开始像访问它们一样访问它们是明智的。必须通过URL而不是文件访问。有关如何形成URL的信息,请参阅。非常感谢您的回答,一旦我理解了您的提示,我将尝试遵循这些提示。如果我们知道图像位置与您的代码之间的关系,那将非常有帮助,谢谢!我试过file.exists,但他找不到,所以我把它放在另一个文件夹中,并使用了我代码中的完整路径,知道它终于起作用了^^^谢谢你的帮助!!!!!如果ypu可以指定或解释我,您的第四个答案id将得到很大帮助:)注意:应用程序资源将在部署时成为嵌入式资源,因此现在就开始像访问它们一样访问它们是明智的。必须通过URL而不是文件访问。有关如何形成URL的信息,请参见。