我正在使用自定义的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
方法,并且与该协议一起使用时,应在Graphics对象要绘制什么(调用paint
)方法,而不是在您想执行时。这样,每当Swing想要绘制
JLayeredPane
时,您只需在其他事物的Graphic
对象上绘制事物,而无需考虑在适当时机Swing会调用其适当的方法。结论:您不能在
Graphic
对象上绘制任何东西。您可以在Swing调用的方法中执行此操作,因为否则这些对象的Graphics
并没有任何意义。关于java - 绘图时Java Swing NullPointerException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2594027/