Java JPanel-更改JPanel的背景颜色时出错

Java JPanel-更改JPanel的背景颜色时出错,java,swing,Java,Swing,我编写了以下代码: import java.awt.Color; import java.awt.Graphics; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JFrame; import javax.swing.JPanel; public class Test extends JFrame{ public Test() {

我编写了以下代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

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

public class Test extends JFrame{
    
    public Test() {
        this.setTitle("Test");
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        JPanel jPanel = new JPanel() {
            public void paint(Graphics g) {
                g.setColor(Color.GREEN);
                g.fillOval(100, 100, 100, 100);
                g.setColor(Color.BLACK);
                g.drawLine(0, 0, 100, 100);
            }
        };
        jPanel.setSize(500, 500);
        jPanel.setBackground(Color.RED);
        this.add(jPanel);
        this.setVisible(true);
        this.setSize(500, 500);
    }
    
    public static void main(String[] args) {
        Test test = new Test();
    }
}
我想画一个圆,画一条线,然后将屏幕的背景色更改为红色,但当我运行程序时,屏幕显示如下:


代码中的错误在哪里?。首先,不要覆盖
paint
,而要覆盖
paintComponent

然后,
setBackground
的javadoc说:

JComponent的直接子类必须重写paintComponent以实现 这是我的财产

因此,在您的情况下,调用此方法本身不会起任何作用,除非您调用父类的
paintComponent
(或者自己绘制背景,但这样做太过分了)

在任何情况下,建议调用
super.paintComponent
,因为父实现可能会执行一些清理或其他有用的操作

下面是代码的修改版本,其中考虑了所有这些因素:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

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

public class Test extends JFrame {

    public Test() {
        this.setTitle("Test");
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(final WindowEvent e) {
                System.exit(0);
            }
        });

        JPanel jPanel = new JPanel() {
            @Override
            public void paintComponent(final Graphics g) {
                // call parent method
                super.paintComponent(g);

                // OR paint background yourself :
                // g.setColor(getBackground());
                // g.fillRect(0, 0, getWidth(), getHeight());


                // paint other things
                g.setColor(Color.GREEN);
                g.fillOval(100, 100, 100, 100);
                g.setColor(Color.BLACK);
                g.drawLine(0, 0, 100, 100);
            }
        };
        jPanel.setSize(500, 500);
        jPanel.setBackground(Color.RED);
        this.add(jPanel);
        this.setVisible(true);
        this.setSize(500, 500);
    }

    public static void main(final String[] args) {
        Test test = new Test();
    }
}

感谢您的帮助,您是否推荐任何书籍、网页或其他资源来学习Java GUI开发?@Lemark:Oracle的教程是一个良好的开端: