gpt4 book ai didi

绘图时 Java Swing NullPointerException

转载 作者:行者123 更新时间:2023-12-02 00:52:01 25 4
gpt4 key购买 nike

我正在使用自定义 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 方法,并且要遵循此协议(protocol),您应该告诉 Graphics 对象在 Swing 询问时要绘制什么到您的对象(调用paint)方法,而不是当您想要这样做时。

通过这种方式,每当 Swing 想要绘制您的 JLayeredPane 时,您只需在其他事物的 Graphic 对象上绘制事物,而无需考虑 Swing 会在需要时调用其适当的方法。是时候这样做了。

结论:您无法在需要时在 Graphic 对象上绘制某些内容。您可以在 Swing 调用的方法中执行此操作,因为否则这些对象的 Graphics 没有任何意义

关于绘图时 Java Swing NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2594027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com