请查看以下代码
package java2D;
import java.awt.BasicStroke;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.*;
import java.awt.*;
public class Joins extends JFrame
{
private JPanel centerPanel;
public Joins()
{
this.setLayout(new BorderLayout());
this.add(createCenterPanel(),"Center");
this.setSize(200,250);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private JPanel createCenterPanel()
{
centerPanel = new JPanel();
//centerPanel.setLayout(new FlowLayout());
Graphics g = centerPanel.getGraphics();
Graphics2D g2d = (Graphics2D)g;
BasicStroke bs1 = new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_BEVEL);
g2d.setStroke(bs1);
g2d.drawRect(15, 15, 80, 50);
BasicStroke bs2 = new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);
g2d.setStroke(bs2);
g2d.drawRect(125, 15, 80, 50);
BasicStroke bs3 = new BasicStroke(8, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
g2d.setStroke(bs3);
g2d.drawRect(235, 15, 80, 50);
return centerPanel;
}
public static void main(String[]args)
{
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run() {
new Joins();
}
});
}
}
此代码生成NullPointerException。我需要在centerPanel
内绘制图形。当我开发Swing应用程序时,我通常将JFrame区域划分为多个JPanels,我也在这里做了,但最终得到了NullPointerException!
以下是错误
run:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at java2D.Joins.createCenterPanel(Joins.java:34)
at java2D.Joins.<init>(Joins.java:17)
at java2D.Joins$1.run(Joins.java:55)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
BUILD SUCCESSFUL (total time: 6 seconds)
请帮忙!
答案 0 :(得分:3)
不要使用getGraphics
。创建一个新的JPanel
并将您的绘画功能放入paintComponent
方法中,记住要调用super.paintComponent(g)
。
答案 1 :(得分:2)
正如已经指出的那样,Graphics g = centerPanel.getGraphics();
是您问题的根源。
你永远不应该使用getGraphics来执行自定义绘画。最好getGraphics
是最后一个绘制周期的快照,最糟糕的是,你看到了最糟糕的结果,它是null
要执行自定义绘制,您应该自己创建一个自定义组件(例如JPanel
之类的内容)并覆盖其paintComponent
方法(不要忘记调用super.paintComponet
)< / p>
请查看Performing Custom Painting了解详情
答案 2 :(得分:1)
错误在于:
Graphics g = centerPanel.getGraphics();
根据javadocs:
为此组件创建图形上下文。如果此组件当前不可显示,则此方法将返回
null
。
也许您需要先将JPanel
添加到Joins
框架,以便在使用getGraphics()
之后?
答案 3 :(得分:-1)
没有任何内容可见,因此getGraphics()返回null。尝试:
centerPanel = new JPanel();
JFrame frame = new JFrame();
frame.add(centerPanel);
frame.setVisible(true);
centerPanel.setVisible(true);