逻辑错误,draw(图形g)在调用时无法绘制(Java)

时间:2012-05-28 18:37:18

标签: java

我发现自己无法利用绘图方法在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);
    }
}

1 个答案:

答案 0 :(得分:2)

首先,这个:

catch(Exception ex){}

会阻止您看到任何出错的地方。你说有“没有显示运行时错误” - 我并不感到惊讶,因为你已经压制了所有内容。

接下来,您永远不会为实例变量g分配值,因此当您将其传递给null方法时,它仍然会有draw的值然后使用不同类型的本地变量g ...并取消引用它。这将导致NullPointerException,然后您可以捕捉并忽略它。

所以基本上会出现很多错误,但从根本上说,你不会只是声明一个Graphics变量,并希望它有一个有用的值。对于“普通”绘制操作,图形上下文会自动提供到您的方法中 - 或者您可以在处理图像对象时创建它。