我正在使用自定义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中添加的几个图层上创建和绘制。
我做错了什么? :■
答案 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。