0

我正在使用自定义的 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 中添加的几个图层上创建和绘制。

我究竟做错了什么?:秒

4

2 回答 2

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这些对象没有任何意义

于 2010-04-07T16:17:35.070 回答
1

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

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

于 2010-04-07T16:14:17.210 回答