Java swing绘图图形指针?

Java swing绘图图形指针?,java,swing,exception,nullpointerexception,Java,Swing,Exception,Nullpointerexception,我想在我的JFrame窗口中画一个矩形,但我总是得到一个nullpointer错误。。 为什么会这样?什么是最好的(正确的)方法来绘制图形,如矩形、渐变等,或者类似于秋千中的降雪 这是一个例外: Exception in thread "Thread-0" java.lang.NullPointerException at gui.Window.run(Window.java:24) at gui.Window$1.run(Window.java:34) at java.

我想在我的
JFrame
窗口中画一个矩形,但我总是得到一个
nullpointer
错误。。 为什么会这样?什么是最好的(正确的)方法来绘制图形,如矩形、渐变等,或者类似于秋千中的降雪

这是一个例外:

Exception in thread "Thread-0" java.lang.NullPointerException
    at gui.Window.run(Window.java:24)
    at gui.Window$1.run(Window.java:34)
    at java.lang.Thread.run(Unknown Source)
资料来源:

public class Window extends JFrame implements Runnable {

    private boolean run = true;

    public Window() {
        super.setSize(500, 500);
        super.setTitle("MY GUI");
        super.setDefaultCloseOperation(EXIT_ON_CLOSE);
        super.setContentPane(new Container());
    }

    @Override
    public void run() {
        Graphics g = super.getContentPane().getGraphics();
        while (this.run) {
            g.setColor(new Color(0, 0, 0, 255));
            g.fillRect(0, 0, 200, 200);
        }
    }

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                Window window = new Window();
                window.run();
            }
        }).start();
    }   
}
错误行24:
g.setColor(新颜色(0,0,0,255))

为什么要这样做?

如果组件不可见,将返回null

要使您的
窗口可见,您必须调用

您还必须小心。

如果组件不可见,将返回null

要使您的
窗口可见,您必须调用


你也必须小心。

你发布的代码毫无意义

首先,与Swing组件的每次交互(除了调用
repaint()
)必须在事件分派线程中完成

第二,运行一个无限循环来不断地在图形上绘制相同的东西是没有意义的

第三,这不是它的工作原理。无法获取与组件关联的图形并在其上绘制。相反,必须重写Swing组件的
paintComponent(Graphics)
方法,等待Swing调用此方法,然后使用提供的Graphics参数绘制所需的任何内容。如果要更改正在绘制的内容,则需要在此元素上调用
repaint()
。不要对JFrame这样做。创建JComponent或JPanel的子类,并将该子类的实例添加到JFrame,然后使该JFrame可见:

public class CustomComponent extends JComponent {
    @Override
    public void paintComponent(Graphics g) {
         // paint here
    }

    @Override
    public Dimension getPreferredSize() {
        // return preferred size here
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame();
                f.add(new CustomComponent());
                f.pack(); 
                f.setVisible(true);
            }
        });
    }
}

你发布的代码毫无意义

首先,与Swing组件的每次交互(除了调用
repaint()
)必须在事件分派线程中完成

第二,运行一个无限循环来不断地在图形上绘制相同的东西是没有意义的

第三,这不是它的工作原理。无法获取与组件关联的图形并在其上绘制。相反,必须重写Swing组件的
paintComponent(Graphics)
方法,等待Swing调用此方法,然后使用提供的Graphics参数绘制所需的任何内容。如果要更改正在绘制的内容,则需要在此元素上调用
repaint()
。不要对JFrame这样做。创建JComponent或JPanel的子类,并将该子类的实例添加到JFrame,然后使该JFrame可见:

public class CustomComponent extends JComponent {
    @Override
    public void paintComponent(Graphics g) {
         // paint here
    }

    @Override
    public Dimension getPreferredSize() {
        // return preferred size here
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame();
                f.add(new CustomComponent());
                f.pack(); 
                f.setVisible(true);
            }
        });
    }
}

g可能为空检查super.getContentPane().getGraphics();,在那里设置断点并调试它..g可能为null检查super.getContentPane().getGraphics();,在那里设置断点并调试它。谢谢!但为什么我运行它时它会这么慢?@user3123545:可能是因为你一直在画画。无限繁忙循环不是一个好主意。因为您正在无限繁忙循环中重新绘制窗口loop@user31223545使用JPanel在paintComponent方法上绘制并重写该方法。你不应该在像JFramework这样的顶级容器上绘画谢谢!但为什么我运行它时它会这么慢?@user3123545:可能是因为你一直在画画。无限繁忙循环不是一个好主意。因为您正在无限繁忙循环中重新绘制窗口loop@user31223545使用JPanel在paintComponent方法上绘制并重写该方法。你不应该在像JFrame这样的顶级容器上绘画