我如何在JPanel上绘制然后显示在JFrame上?

时间:2018-02-13 03:19:43

标签: java swing user-interface nullpointerexception jpanel

我试图研究Java的2D渲染是如何工作的,但我永远无法理解它。这是我主类中的代码:

import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main{

    public static void main(String args[]) {
        JFrame frame = new JFrame();
        frame.setSize(new Dimension(500,500));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("JFrame testing");
        frame.setVisible(true);
        Frame panel = new Frame();
        frame.add(panel);
    }
}

然后是JPanel类:

import java.awt.Graphics;

import javax.swing.JPanel;

public class Frame extends JPanel{
    private static final long serialVersionUID = 1L;

    public Frame() {
        Graphics g = this.getGraphics();
        g.drawRect(0, 0, 100, 100);
        this.paintComponent(g);
    }
}

我也得到了这个例外,但我不确定它是什么意思:

Exception in thread "main" java.lang.NullPointerException
    at Frame.<init>(Frame.java:10)
    at Main.main(Main.java:18)

我基本上只是想在一个面板上绘制一个矩形,以便在我创建的框架上显示。我听说过paintComponent方法,但我也不完全理解。

1 个答案:

答案 0 :(得分:1)

您应该从不使用组件的getGraphics()

尝试以下代码

 public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawRect(0, 0, 100, 100);
        //this.paintComponent(g);
    }

修改

  

&#34; 为什么是super.paintComponent(g);在方法中再次调用?&#34;

paintComponent的{​​{3}}说得很好:

  

如果你没有调用超级实现,你必须尊重不透明   属性,即如果此组件是不透明的,则必须完全   以非不透明的颜色填充背景。如果你不尊重   opaque属性你可能会看到视觉文物。