Java JFrame中的BuffereImage未显示

Java JFrame中的BuffereImage未显示,java,swing,jframe,bufferedimage,drawimage,Java,Swing,Jframe,Bufferedimage,Drawimage,正在尝试将图像打印到窗口中。一切运行都没有错误,如果我用另一个图形类替换drawImage,它也可以工作。然而,窗口缺少图像,我不知道为什么。同样,JFrame的东西和图形可以很好地绘制其他图形,但只是没有在这里绘制图像。谢谢 import javax.swing.JApplet; import javax.swing.JFrame; import javax.imageio.*; import javax.imageio.stream.*; import java.awt.*; import

正在尝试将图像打印到窗口中。一切运行都没有错误,如果我用另一个图形类替换drawImage,它也可以工作。然而,窗口缺少图像,我不知道为什么。同样,JFrame的东西和图形可以很好地绘制其他图形,但只是没有在这里绘制图像。谢谢

import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.imageio.*;
import javax.imageio.stream.*;
import java.awt.*;
import java.awt.image.*;
import java.io.*;

public class GraphicsMovement2 extends JApplet{
    BufferedImage image = null;

    public static void main(String args[]){
        BufferedImage image = null;
        try {
            File file = new File("C:\\Users/Jonheel/Google Drive/School/10th Grade/AP Computer Science/Junkbin/MegaLogo.png");
            ImageInputStream imgInpt = new FileImageInputStream(file);
            image = ImageIO.read(file);
        }
        catch(FileNotFoundException e) {
            System.out.println("x");
        }
        catch(IOException e) {
            System.out.println("y");
        }


        JApplet example = new GraphicsMovement2();
        JFrame frame = new JFrame("Movement");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(example);
        frame.setSize(new Dimension(1366,768));       //Sets the dimensions of panel to appear when run
        frame.setVisible(true);
    }
    public void paint (Graphics page){
    page.drawImage(image, 100, 100, 100, 100, Color.RED, this);
  }
}

当您甚至不使用applet时,您的类不应该扩展JApplet-这毫无意义。反而

让你的绘图课扩展JPanel 使用JPanel的paintComponent方法绘制 将此JPanel添加到JFrame的contentPane。 读这本书。你不能猜测这些东西,并期待它的工作,教程将向你展示如何正确地完成。
当您甚至不使用applet时,您的类不应该扩展JApplet-这毫无意义。反而

让你的绘图课扩展JPanel 使用JPanel的paintComponent方法绘制 将此JPanel添加到JFrame的contentPane。 读这本书。你不能猜测这些东西,并期待它的工作,教程将向你展示如何正确地完成。
不要混合使用文件设备

File File=new FileC:\\Users/Jonheel/Google Drive/School/10th Grade/AP Computer Science/Junkbin/MegaLogo.png

应替换为:

File File=new FileC:/Users/Jonheel/Google Drive/School/10年级/AP Computer Science/Junkbin/MegaLogo.png


不要混合使用文件设备

File File=new FileC:\\Users/Jonheel/Google Drive/School/10th Grade/AP Computer Science/Junkbin/MegaLogo.png

应替换为:

File File=new FileC:/Users/Jonheel/Google Drive/School/10年级/AP Computer Science/Junkbin/MegaLogo.png

您已定义图像两次

这本质上意味着,当您到达paint方法时,它是null,因为您还没有初始化实例变量

您将遇到的另一个问题是,您试图从静态引用加载图像,但该图像未声明为静态。最好将此逻辑移到构造函数或实例方法中

在添加到JFrame时不要使用JApplet作为容器,最好使用类似JPanel的东西。在向容器添加内容时,它会有所帮助

您必须调用super.paintg…事实上,不要重写顶级容器(如JFrame或JApplet)的绘制方法。使用类似JPanel的方法,并替代paintComponent方法。顶级容器不是双缓冲的

绘制方法做了很多重要的工作,使用JComponentpaintComponent更容易。。。但别忘了打电话给super.paintComponent

更新

您需要在要使用的上下文中定义图像

由于已将图像声明为GraphicsMovement2的实例字段,因此需要GraphicsMovement2的实例才能引用它

但是,在main方法中(它是静态的),还声明了一个名为image的变量

GraphicsMovement2的paint方法无法看到您在main中声明的变量,只能看到实例字段,该字段为null

为了解决此问题,您需要将图像加载移动到GraphicsMovement2实例的上下文中,这在您的上下文中可以最好地实现,但是将图像加载移动到GraphicsMovement2的构造函数中

下面的两个例子将产生相同的结果

捷径

艰难的道路

花点时间通读教程

您已定义图像两次

这本质上意味着,当您到达paint方法时,它是null,因为您还没有初始化实例变量

您将遇到的另一个问题是,您试图从静态引用加载图像,但该图像未声明为静态。最好将此逻辑移到构造函数或实例方法中

在添加到JFrame时不要使用JApplet作为容器,最好使用类似JPanel的东西。在向容器添加内容时,它会有所帮助

您必须调用super.paintg…事实上,不要重写顶级容器(如JFrame或JApplet)的绘制方法。使用类似JPanel的方法,并替代paintComponent方法。顶级容器不是双缓冲的

绘制方法做了很多重要的工作,使用JComponentpaintComponent更容易。。。但别忘了打电话给super.paintComponent

更新

您需要在要使用的上下文中定义图像

由于已将图像声明为GraphicsMovement2的实例字段,因此需要GraphicsMovement2的实例才能引用它

但是,在main方法中(它是静态的),还声明了一个名为image的变量

GraphicsMovement2的paint方法无法看到您在main中声明的变量,只能看到实例字段,该字段为null

为了解决此问题,您需要将图像加载移动到GraphicsMovement2实例的上下文中,这在您的上下文中可以最好地实现,但是将图像加载移动到GraphicsMovement2的构造函数中

下面的两个例子将产生相同的结果

捷径

艰难的道路

花点时间通读教程


难道没有办法避免吗?再说一次,尽管这可能不是最好的方法,但它完成了任务,而且在这个程序显示BuffereImage后,我没有扩展它。@user1793082:为什么没有充分的理由尝试以错误的方式进行操作?再说一次,这毫无意义。你可以用虎钳夹住钉子,这会有点效果,但为什么在锤子更适合这项工作的时候还要继续这样做呢?@user1793082将我的头靠在墙上会把墙撞倒,但为什么要忍受痛苦……我完全同意,但我正试图一瘸一拐地越过终点线。在这个程序之后,我不会很长时间再回到图形领域,所以我现在不想找一个写得很好的程序。@user1793082我不会很长时间再回到图形领域。不要限制自己,你不知道生活会把你拖到哪里,又踢又叫;难道没有办法避免吗?再说一次,尽管这可能不是最好的方法,但它完成了任务,而且在这个程序显示BuffereImage后,我没有扩展它。@user1793082:为什么没有充分的理由尝试以错误的方式进行操作?再说一次,这毫无意义。你可以用虎钳夹住钉子,这会有点效果,但为什么在锤子更适合这项工作的时候还要继续这样做呢?@user1793082将我的头靠在墙上会把墙撞倒,但为什么要忍受痛苦……我完全同意,但我正试图一瘸一拐地越过终点线。在这个程序之后,我不会很长时间再回到图形领域,所以我现在不想找一个写得很好的程序。@user1793082我不会很长时间再回到图形领域。不要限制自己,你不知道生活会把你拖到哪里,又踢又叫;很好,帮我保存了一个角色,但其他的就不多了。这没有帮助,我以前有一个文件读取程序,用另一种方式工作。这对我保存一个字符很好,但其他的就不多了。这没有帮助,我以前有一个文件读取程序,它使用另一种方式工作。这个答案有点让我无法理解,我是否将“BufferedImage image=null;”主要方法是什么?我之前试着不这么做,但正如你所说,我在声明为静态时遇到了问题。感谢对这两个问题进行了详细的修复。看到这两件事,我的态度肯定改变了。在将此标记为已解决之前,我的最后一个问题是是否应该将ImagePane类放入一个新的.java文件中。其他的东西至少现在就可以构建,而且看起来也更好。@Jonheel我的示例中的ImagePane应该是完全独立的,从重用的角度来看,是的,它可以在自己的源文件中谢谢,这正是我想要的。图形中的内容仍然比我高一点,即使在这之后,所以当我回到图形中时,我一定会回到这一点上。这个答案有点超出我的理解范围,我是否将“BufferedImage image=null;”主要方法是什么?我之前试着不这么做,但正如你所说,我在声明为静态时遇到了问题。感谢对这两个问题进行了详细的修复。看到这两件事,我的态度肯定改变了。在将此标记为已解决之前,我的最后一个问题是是否应该将ImagePane类放入一个新的.java文件中。其他的东西至少现在就可以构建,而且看起来也更好。@Jonheel我的示例中的ImagePane应该是完全独立的,从重用的角度来看,是的,它可以在自己的源文件中谢谢,这正是我想要的。图形中的内容仍然比我高一点,即使在这之后,所以当我回到图形中时,我一定会回到这一点。
BufferedImage image = null;

public static void main(String args[]){
    BufferedImage image = null;
public GraphicsMovement2() {
    try {
        File file = new File("C:\\Users/Jonheel/Google Drive/School/10th Grade/AP Computer Science/Junkbin/MegaLogo.png");
        ImageInputStream imgInpt = new FileImageInputStream(file);
        image = ImageIO.read(file);
    }
    catch(FileNotFoundException e) {
        System.out.println("x");
    }
    catch(IOException e) {
        System.out.println("y");
    }
}
public class TestPaintImage {

    public static void main(String[] args) {
        new TestPaintImage();
    }

    public TestPaintImage() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new ImagePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ImagePane extends JPanel {

        public ImagePane() {
            setLayout(new BorderLayout());
            ImageIcon icon = null;
            try {
                icon = new ImageIcon(ImageIO.read(new File("/path/to/your/image")));
            } catch (Exception e) {
                e.printStackTrace();
            }
            add(new JLabel(icon));
        }

    }
}
public class TestPaintImage {

    public static void main(String[] args) {
        new TestPaintImage();
    }

    public TestPaintImage() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new ImagePane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class ImagePane extends JPanel {

        private BufferedImage background;

        public ImagePane() {
            try {
                background = ImageIO.read(new File("/path/to/your/image"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return background == null ? super.getPreferredSize() : new Dimension(background.getWidth(), background.getHeight());
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (background != null) {
                int x = (getWidth() - background.getWidth()) / 2;
                int y = (getHeight() - background.getHeight()) / 2;
                g.drawImage(background, x, y, this);
            }
        }
    }
}