1

我有 2 节课:
- 第 1 节课。制作一个框架(JFrame)并在其上添加一个面板(JPanel)
- 第二个制作面板并在其上绘制一个矩形(至少我认为它会)

这是第一堂课

class Frame {
JFrame frame;
Panel panel;

void draw() {
    frame = new JFrame ("qwertz");
    frame.setVisible(true);
    frame.setLocationRelativeTo(null);
    frame.setSize(300,200);

    panel = new Panel();
    panel.setLayout(null);
    panel.paint();
    frame.add(panel);
    }}

第二个

class Panel extends JPanel {
void paint() {
    Graphics g = getGraphics();

    g.drawRect(50,50,90,70);
}}

当我从第一个类调用 draw() 方法时,它会向我抛出这个异常:

java.lang.NullPointerException  
          at Panel.paint(Panel.java:8) ((  g.drawRect(50,50,90,70);  ))
          at Frame.draw(Frame.java:15) ((  panel.paint();            ))
4

3 回答 3

2

这不是你应该画的方式。要绘制组件,请覆盖then 调用的paintComponent(Graphics g)方法JPanelrepaint();

class MyPanel extends JPanel {
    @Override // <-- this makes a compiler error if you typod the method name
    public void paintComponent(Graphics g) {
        g.drawRect(50,50,90,70);
    }
}

panel = new MyPanel();
panel.setLayout(null);
panel.repaint(); // <<---- Look here! It says repaint() not paint()
frame.add(panel);

此外,如果您所要做的就是在此面板上绘画,我会考虑使用普通旧的Component,并覆盖paint(Graphics g)而不是paintComponent(Graphics g). paintComponent(Graphics g)专门用于摆动组件。

于 2013-05-03T18:47:11.610 回答
1

您应该实现paintComponent(Graphics g) 方法,而不是实现paint 方法。这样,您拥有的图形对象是有效的。

http://docs.oracle.com/javase/6/docs/api/javax/swing/JComponent.html#paintComponent(java.awt.Graphics)

于 2013-05-03T18:45:07.253 回答
0

您正在尝试在将面板添加到框架之前绘制面板。试着往下frame.paint();移动frame.add(panel);。此外,如果您使用 Swing,则应使用 JPanel 而不是 Panel。

于 2013-05-03T18:43:41.270 回答