你已经定义image
了两次...
BufferedImage image = null;
public static void main(String args[]){
BufferedImage image = null;
这实质上意味着当您使用该paint
方法时,null
您还没有初始化实例变量。
您将遇到的另一个问题是您尝试从静态引用加载图像image
但未声明为static
. 最好将此逻辑移动到构造函数或实例方法中。
添加到 a 时不要JApplet
用作容器JFrame
,最好使用类似JPanel
. 在向容器添加内容时会有所帮助。
你必须调用 super.paint(g)
......事实上,不要覆盖paint
顶级容器的方法,如JFrame
or JApplet
。使用类似的东西JPanel
并覆盖该paintComponent
方法。顶级容器不是双缓冲的。
这些paint
方法做了很多重要的工作,而且更容易使用JComponent#paintComponent
......但不要忘记调用super.paintComponent
更新
您需要image
在将要使用的上下文中进行定义。
因为您将 声明image
为 的实例字段GraphicsMovement2
,所以您需要一个 的实例GraphicsMovement2
才能引用它。
但是,在您的main
方法中static
,您还声明了一个名为image
.
的paint
方法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));
}
}
}
艰难的道路
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);
}
}
}
}
花时间阅读教程