Java 在JPanel上使用图形

Java 在JPanel上使用图形,java,swing,nullpointerexception,jpanel,java-2d,Java,Swing,Nullpointerexception,Jpanel,Java 2d,我尝试使用以下代码为JPanel绘制一个矩形: JPanel background = new JPanel(); Graphics2D g = null; Graphics2D g2d = (Graphics2D) g; g2d.setColor(Color.BLACK); g2d.drawRect(0, 0, 800, 600); 当我试图编译它时,我得到了错误 设置颜色行上的java.lang.NullPointerException 我也尝试过这个,但我得到了同样的错误 JPanel

我尝试使用以下代码为JPanel绘制一个矩形:

JPanel background = new JPanel();
Graphics2D g = null;
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.BLACK);
g2d.drawRect(0, 0, 800, 600);
当我试图编译它时,我得到了错误

设置颜色行上的java.lang.NullPointerException

我也尝试过这个,但我得到了同样的错误

JPanel background = new JPanel();
Graphics bg = background.getGraphics();
bg.setColor(Color.BLACK);
bg.drawRect(0, 0, 800, 600);

有人能帮我修复这个错误吗?

创建JPanel的子类,并重写
paintComponent(Graphics g)
方法。仅使用作为参数传递给该方法的
Graphics
从该方法绘制,您可以安全地将其强制转换为
Graphics2D

JPanel background = new JPanel() {
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.BLACK);
        g2d.drawRect(0, 0, 800, 600);
    }
}

要在JPanel上绘图,需要重写
paintComponent()
。您可以按如下方式动态重写它或创建子类:

JPanel background = new JPanel()
{
    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setColor(Color.BLACK);
        g2d.drawRect(0, 0, 800, 600);
    }
};

Swing中的自定义绘制通常通过重写扩展JComponent的任何类的paintComponent方法来完成。除非您有其他需要,否则建议您从类似JPanel的东西进行扩展

public class MyPanel exends JPanel {
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.drawRect(0, 0, 800, 600);
    }

    public Dimension getPreferredSize() {
        return new Dimension(800, 600);
    }
}

查看并了解更多详细信息

在第一种情况下,g设置为null,因此g2d也为null->NPE在g2d.setColor通常我建议编写您自己的面板并覆盖paint()方法,而不是执行您目前正在执行的任何操作。super。paintComponent@MadProgrammer更正了。谢谢:)仍然缺少一些东西,但基本的东西还在那里;)+1您还需要覆盖面板的
getPreferredSize()
方法,这样布局管理器将知道如何正确使用组件。+1用于覆盖
getPreferredSize()
。现在
pack()
可以重新调整JFrame的大小以显示矩形;)@这是我发帖子的唯一原因(除了前两个答案当时缺失
super.paintComponent
))