我发现自己无法利用绘图方法在JFrame中显示图像。如果从不调用draw(Graphics p)方法,则下面的代码功能完全相同。导致这种功能缺失的原因是什么,以及可以采取哪些措施来解决这个问题? (假设“C:\ test \ background.png”是有效路径。)没有编译时错误,也没有显示运行时错误。这是该计划中唯一的课程。尝试在JPanel中绘制并不能解决问题。
package gui;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
public class Main extends JFrame{
private Image mainMenuBackground;
private String state;
Graphics g;
Main(){
setSize(800, 600);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
state = "main menu";
}
public static void main(String args[]){
Main m = new Main();
m.run();
}
public void loadImages(){
mainMenuBackground = new ImageIcon("C:\\test\\background.png").getImage();
}
public void run(){
try{
loadImages();
draw(g);
pack();
}catch(Exception ex){}
}
public void draw(Graphics p){
Graphics2D g = (Graphics2D) p;
g.drawImage(mainMenuBackground, 0, 0, null);
g.drawRect(0, 0, 50, 50);
}
}
答案 0 :(得分:2)
首先,这个:
catch(Exception ex){}
会阻止您看到任何出错的地方。你说有“没有显示运行时错误” - 我并不感到惊讶,因为你已经压制了所有内容。
接下来,您永远不会为实例变量g
分配值,因此当您将其传递给null
方法时,它仍然会有draw
的值然后使用不同类型的本地变量g
...并取消引用它。这将导致NullPointerException
,然后您可以捕捉并忽略它。
所以基本上会出现很多错误,但从根本上说,你不会只是声明一个Graphics
变量,并希望它有一个有用的值。对于“普通”绘制操作,图形上下文会自动提供到您的方法中 - 或者您可以在处理图像对象时创建它。