无法获取要在Java中显示的图像
我正在做一个SwingBot,不知道如何让图像出现。它编译得很好,但不可见。我做错了什么?它位于名为“images”的文件夹中,与我的代码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
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);
}
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);
}
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);
}
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);
}