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

Java 我如何在JPanel上绘制,然后在JFrame上显示?,java,swing,user-interface,nullpointerexception,jpanel,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.setSiz

我曾试图研究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类:

我也得到了这个例外,但我不确定这意味着什么:

Exception in thread "main" java.lang.NullPointerException
    at Frame.<init>(Frame.java:10)
    at Main.main(Main.java:18)
我基本上只是想在面板上画一个矩形,显示在我创建的框架上。我听说过paintComponent方法,但我也不完全理解

永远不要使用组件的getGraphics

试试下面的代码

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

为什么是super.PaintComponent;在方法内部再次调用

paintComponent的组件很好地说明了这一点:

如果不调用super的实现,则必须遵守不透明的 属性,即如果此组件是不透明的,则必须完全 用非不透明的颜色填充背景。如果你不尊重 不透明属性您可能会看到视觉瑕疵


谢谢你,但是你介意解释一下这是做什么的吗?因为我不太确定paintComponent方法是做什么的。当你的项目运行时,paintComponent函数会被调用,方法是将Graphics参数作为图形上下文传递给你,你可以在它上面绘制。所以我了解到paintComponent正在重写Jcomponent对象,但为什么是super.PaintComponent;在方法内部再次调用?您可能会看到抱歉,我刚刚将注释更新为:因此我了解到paintComponent正在重写Jcomponent对象,但为什么super.paintComponent;在方法内部再次调用?我只是试着不用它,但它仍然有效,那么把它包括进去有什么意义呢?
 public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawRect(0, 0, 100, 100);
        //this.paintComponent(g);
    }