繁体   English   中英

绘图时Java Swing NullPointerException

[英]Java Swing NullPointerException when drawing

我正在使用自定义的JLayeredPane。 我有几个形状需要在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中添加的几层上。

我究竟做错了什么? :s

您应该使用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方法,并且要使用此协议,您应该在Swing向您的对象(调用paint )方法提出要求时告诉Graphics对象要绘制的内容,而不是在您需要时去做吧。

这样,只要Swing想要绘制JLayeredPane您就可以在其他对象的Graphic对象上绘制事物,而无需考虑在适当的时候Swing会调用其适当的方法。

总结: 不能在Graphic对象上绘制任何东西。 您可以在Swing调用的方法中执行此操作,因为否则这些对象的Graphics不会有任何意义。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM