尝试将图像打印到窗口中。一切都运行没有错误,如果我用另一个图形类替换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);
}
}
答案 0 :(得分:7)
您已定义image
两次......
BufferedImage image = null;
public static void main(String args[]){
BufferedImage image = null;
这实际上意味着当你到达paint
方法时,它是null
,因为你还没有初始化实例变量。
您将遇到的另一个问题是您尝试从静态引用加载图像,但image
未声明为static
。最好将此逻辑移动到构造函数或实例方法中。
当您添加JApplet
时,请勿使用JFrame
作为容器,您最好使用JPanel
之类的内容。在将容器添加到容器中时,它会有所帮助。
您必须致电 super.paint(g)
...事实上,不要覆盖paint
等顶级容器的JFrame
方法}或JApplet
。使用类似JPanel
的内容并改写paintComponent
方法。顶级容器不是双缓冲的。
paint
方法做了很多重要工作,使用JComponent#paintComponent
更容易......但不要忘记致电super.paintComponent
<强>已更新强>
您需要在将要使用的上下文中定义image
。
由于您将image
声明为GraphicsMovement2
的实例字段,因此您需要GraphicsMovement2
的实例才能引用它。
但是,在main
方法static
中,您还声明了一个名为image
的变量。
paint
的{{1}}方法无法看到您在GraphicsMovement2
中声明的变量,只能看到实例字段(main
)。
为了解决问题,您需要将图像加载到null
实例的上下文中,这可能是最好的(在您的上下文中),但是将图像加载到GraphicsMovement2
GraphicsMovement2
以下两个例子将产生相同的结果......
轻松的方式
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));
}
}
}
花点时间阅读教程
答案 1 :(得分:2)
当你甚至不使用applet时,你的类不应该扩展JApplet - 这没有任何意义。代替
答案 2 :(得分:2)
不要混合文件分隔符,
文件文件=新文件(“C:\\ Users / Jonheel / Google Drive / School / 10th Grade / AP Computer Science / Junkbin / MegaLogo.png”);
应替换为:
文件档案=新档案(“C:/ Users / Jonheel / Google Drive / School / 10th Grade / AP Computer Science / Junkbin / MegaLogo.png”);