尝试使用 paintComponent 绘制一个圆

Trying to draw a circle using paintComponent

我正在做一个作业,我创建了一个 GUI,在上面画了一个圆圈或一个脸,并为用户提供了在他们单击按钮时更改面部特征的选项,我已经完成了基本布局,但现在我想在我的 GUI 的主面板中画一个圆圈,我创建了另一个扩展 JPanel 的文件,我创建了 paintComponent 方法并在主应用程序上调用它,但它不会得到一个圆圈,而是会在主面板的顶部有一个小正方形,我已经尝试过大小​​但无论我改变什么仍然会给我同样的东西,我不知道如果我能得到一些帮助我会错过什么感谢它和一些建议..提前谢谢你

这是我的 JPanel 主应用程序

public class FaceApp extends JFrame {

    /**
     * 
     */

    JPanel panel,mainPanel;
    Graphics graph;

    public static void main(String[] args) {
        FaceApp frame = new FaceApp();
        frame.setVisible(true);
        frame.setBackground(Color.BLUE);
        frame.setSize(1000,1000);
        frame.setResizable(false);
    }

    private FaceApp() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        setTitle("Face");

        panel = new JPanel(new GridLayout(16,1,1,1));
        panel.setBorder(new EmptyBorder(30,30,100,100));

        mainPanel = new JPanel();
        JCheckBox eyes = new JCheckBox("Eyes");
        JCheckBox noes = new JCheckBox("Nose");
        JCheckBox mouth = new JCheckBox("Mouth");
        JLabel label = new JLabel();

        JButton update = new JButton("update");

        label.setText("You choose..");

        panel.add(label);
        panel.add(eyes);
        panel.add(noes);
        panel.add(mouth);
        panel.add(update);

        Face face = new Face();

        mainPanel.setBackground(Color.BLUE);
        mainPanel.add(face);

        add(mainPanel,BorderLayout.CENTER);
        add(panel, BorderLayout.WEST);

    }
}

这是画画的 Face class:

public class Face extends JPanel{

    /**
     * 
     */

    public Face(){
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.fillOval(20, 30, 150, 150);
        g.setColor(Color.red);      
    }
}
mainPanel.add(face);

您正在将面部组件添加到使用 FlowLayout 的面板。 FlowLayout 尊重添加到它的任何组件的首选大小。在您的情况下,首选大小为 (0, 0),因此布局管理器无法正常工作。

您需要将 class 的 getPreferredSize() 方法重写为 return 组件的首选大小,在您的情况下可能是 (190, 210) 所以椭圆在面板中居中。

您可以阅读 Swing 教程中关于 Custom Painting 的部分,以获取演示如何实现此方法的工作示例。随身携带 link 本教程,因为它包含许多 Swing 基础知识的示例。