绘制时Java Swing NullPointerException

时间:2010-04-07 16:12:27

标签: java swing drawing nullpointerexception jlayeredpane

我正在使用自定义JLayeredPane。 我有几个Shapes需要在JLayeredPane中的不同图层上绘制。

为了测试这个,我创建了一个JPanel并询问它的图形。然后我在JPanel上绘制一个测试矩形(准备图形),在JLayeredPane的paintComponent方法中,我最终绘制了所有内容。但这失败了(NullPointerException)。

public class MyCustomPanel extends JLayeredPane {

// test
JPanel testpane;
Graphics g2;
// test

// constructor
public MyCustomPanel() {
    testpane = new JPanel();
    this.add(testpane, new Integer(14));
    g2 = testpane.getGraphics();
}

@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);

    g2.drawRect(10, 10, 300, 300);
}

}

// run:
//Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
//        at view.MyCustomPanel.paintComponent(MyCustomPanel.java:65)

为什么我不能在JLayeredPane中绘制这样的JPanel?我可以从我的paintComponent方法中直接在我的JLayeredPane上绘制,但这是在JLayeredPane的默认面板上。我需要在我的JLayeredPane中添加的几个图层上创建和绘制。

我做错了什么? :■

2 个答案:

答案 0 :(得分:2)

您应该使用g2投射传递给您的Graphics

Graphics2D g2 = (Graphics2D)g;

你为什么不尝试脱钩?

class InnerPanel extends JPanel
{
  public void paint(Graphics g)
  {
     Graphics2D g2 = (Graphics2D)g;
     g2.drawRect(....);
  }
}

class MyLayered extends JLayeredPane()
{
  MyLayered()
  {
    this.add(new InnerPanel(), 14);
  }
}

这更有意义..

另外,因为您正在尝试做一些与Swing行为不一致的事情。 Swing会自行调整适当的paint方法而不是必须显示的东西,并且要使用这个协议,你应该告诉Graphics对象当Swing向你的对象询问时要绘制什么(调用paint)方法,而非您想要的方法。

通过这种方式,只要Swing想要绘制你的JLayeredPane,你就可以在其他事物的Graphic对象上绘制东西,而不考虑Swing会在适当的时候调用他们适当的方法。

总之:您无法在Graphic对象上绘制内容。你可以在Swing调用的方法中做到这一点,因为否则Graphics这些对象并不意味着什么

答案 1 :(得分:1)

变量g2可能为null,因为您在构造函数中设置它,而不是在绘制时。相反,使用传入的“g”。

您只能从当前正在绘制的组件中获取合法的图形。否则,它无效。在您请求它时,MyCustomPanel()没有显示,也没有显示testpane。