无法获取要在Java中显示的图像

无法获取要在Java中显示的图像,java,swing,paint,Java,Swing,Paint,我正在做一个SwingBot,不知道如何让图像出现。它编译得很好,但不可见。我做错了什么?它位于名为“images”的文件夹中,与我的代码java文件位于同一目录中 import javax.swing.JFrame; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import javax.swing.JComponent; import java.awt.geom.Ellipse

我正在做一个SwingBot,不知道如何让图像出现。它编译得很好,但不可见。我做错了什么?它位于名为“images”的文件夹中,与我的代码java文件位于同一目录中

import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import javax.swing.JComponent;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.awt.Color;
import java.awt.Polygon;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
import java.io.IOException;
import java.util.Scanner;



public class SwingBot
{
public static void main(String[] args)
{

    // contruction of new JFrame object
    JFrame frame = new JFrame();

    // mutators
    frame.setSize(400,400);
    frame.setTitle("SwingBot");

    // program ends when window closes
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    Robot r = new Robot();

    frame.add(r);

    // voila!
    frame.setVisible(true);


    // your Scanner-based command loop goes here

    int noend = 0;
    System.out.println("Enter Commands");
    while(noend == 0)
    {

    Scanner input = new Scanner(System.in);

    String command = input.next();

    if(command.equals("left"))
        r.moveBot(10,0);

    if(command.equals("right"))
        r.moveBot(-10,0);

    if(command.equals("down"))
        r.moveBot(0,10);

    if(command.equals("up"))
        r.moveBot(0,-10);

    // call methods on the Robot instance like w.moveBot(10,10) in response to
    // user input



 } 
}


}这很容易被忽视,因为它太奇怪了。您有一个方法
ImagePanel()
。我认为可以安全地假设,您从
ImagePanel
获得的代码是类,
ImagePanel()
是构造函数,您只是添加了
void
,因为您收到一个错误,说该方法需要返回类型

您应该做的是将
public ImagePanel()
变成
public Robot()
,这样您的
Robot
类就有了一个构造函数。当前,您实例化了
Robot
,但从未初始化图像,因为从未调用方法
ImagePanel()

  • 你可能需要复习一些基础知识

  • public void ImagePanel()
    更改为
    public Robot()

  • 不要从
    文件
    对象加载图像。使用
    Robot.class.getResource(“path/to/image.png”)
    通过类路径加载它们。有关详细信息,请访问

  • 您应该在
    paintComponent
    方法中调用
    super.paintComponent

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
    }
    
  • 绘制时,您应该覆盖
    JComponent的
    getPreferredSize()
    ,以便该组件具有首选大小,然后您可以只
    pack()

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(width, height);
    }
    
  • 从事件调度线程运行Swing应用程序,但使用
    SwingUtilities.invokLater
    。看


  • 见下面的例子

    更新

    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    
    
    public class SwingBot {
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable(){
                public void run() {
                    JFrame frame = new JFrame();
                    frame.add(new Robot());
                    frame.pack();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public static class Robot extends JComponent {
            BufferedImage img;
    
            public Robot() {
                try {
                    img = ImageIO.read(Robot.class.getResource("/images/android.jpg"));
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(img, 0, 0, 300, 300, this);
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 300);
            }
        }
    }
    

    文件结构

    ProjectRoot
             src
                somepackage
                     SwingBot.java
                images
                     android.jpg
    

    这很容易被忽略,只是因为它太奇怪了。您有一个方法
    ImagePanel()
    。我认为可以安全地假设,您从
    ImagePanel
    获得的代码是类,
    ImagePanel()
    是构造函数,您只是添加了
    void
    ,因为您收到一个错误,说该方法需要返回类型

    您应该做的是将
    public ImagePanel()
    变成
    public Robot()
    ,这样您的
    Robot
    类就有了一个构造函数。当前,您实例化了
    Robot
    ,但从未初始化图像,因为从未调用方法
    ImagePanel()

  • 你可能需要复习一些基础知识

  • public void ImagePanel()
    更改为
    public Robot()

  • 不要从
    文件
    对象加载图像。使用
    Robot.class.getResource(“path/to/image.png”)
    通过类路径加载它们。有关详细信息,请访问

  • 您应该在
    paintComponent
    方法中调用
    super.paintComponent

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
    }
    
  • 绘制时,您应该覆盖
    JComponent的
    getPreferredSize()
    ,以便该组件具有首选大小,然后您可以只
    pack()

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(width, height);
    }
    
  • 从事件调度线程运行Swing应用程序,但使用
    SwingUtilities.invokLater
    。看


  • 见下面的例子

    更新

    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    
    
    public class SwingBot {
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable(){
                public void run() {
                    JFrame frame = new JFrame();
                    frame.add(new Robot());
                    frame.pack();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public static class Robot extends JComponent {
            BufferedImage img;
    
            public Robot() {
                try {
                    img = ImageIO.read(Robot.class.getResource("/images/android.jpg"));
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(img, 0, 0, 300, 300, this);
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 300);
            }
        }
    }
    

    文件结构

    ProjectRoot
             src
                somepackage
                     SwingBot.java
                images
                     android.jpg
    

    这很容易被忽略,只是因为它太奇怪了。您有一个方法
    ImagePanel()
    。我认为可以安全地假设,您从
    ImagePanel
    获得的代码是类,
    ImagePanel()
    是构造函数,您只是添加了
    void
    ,因为您收到一个错误,说该方法需要返回类型

    您应该做的是将
    public ImagePanel()
    变成
    public Robot()
    ,这样您的
    Robot
    类就有了一个构造函数。当前,您实例化了
    Robot
    ,但从未初始化图像,因为从未调用方法
    ImagePanel()

  • 你可能需要复习一些基础知识

  • public void ImagePanel()
    更改为
    public Robot()

  • 不要从
    文件
    对象加载图像。使用
    Robot.class.getResource(“path/to/image.png”)
    通过类路径加载它们。有关详细信息,请访问

  • 您应该在
    paintComponent
    方法中调用
    super.paintComponent

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
    }
    
  • 绘制时,您应该覆盖
    JComponent的
    getPreferredSize()
    ,以便该组件具有首选大小,然后您可以只
    pack()

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(width, height);
    }
    
  • 从事件调度线程运行Swing应用程序,但使用
    SwingUtilities.invokLater
    。看


  • 见下面的例子

    更新

    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import javax.imageio.ImageIO;
    import javax.swing.JComponent;
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    
    
    public class SwingBot {
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable(){
                public void run() {
                    JFrame frame = new JFrame();
                    frame.add(new Robot());
                    frame.pack();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public static class Robot extends JComponent {
            BufferedImage img;
    
            public Robot() {
                try {
                    img = ImageIO.read(Robot.class.getResource("/images/android.jpg"));
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.drawImage(img, 0, 0, 300, 300, this);
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 300);
            }
        }
    }
    

    文件结构

    ProjectRoot
             src
                somepackage
                     SwingBot.java
                images
                     android.jpg
    

    这很容易被忽略,只是因为它太奇怪了。您有一个方法
    ImagePanel()
    。我认为可以安全地假设,您从
    ImagePanel
    获得的代码是类,
    ImagePanel()
    是构造函数,您只是添加了
    void
    ,因为您收到一个错误,说该方法需要返回类型

    您应该做的是将
    public ImagePanel()
    变成
    public Robot()
    ,这样您的
    Robot
    类就有了一个构造函数。当前,您实例化了
    Robot
    ,但从未初始化图像,因为从未调用方法
    ImagePanel()

  • 你可能需要复习一些基础知识

  • public void ImagePanel()
    更改为
    public Robot()

  • 不要从
    文件
    对象加载图像。使用
    Robot.class.getResource(“path/to/image.png”)
    通过类路径加载它们。有关详细信息,请访问

  • 您应该在
    paintComponent
    方法中调用
    super.paintComponent

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
    }