Java 尝试使用paintComponent绘制圆

Java 尝试使用paintComponent绘制圆,java,swing,jpanel,paintcomponent,Java,Swing,Jpanel,Paintcomponent,我正在做一项任务,我创建了一个GUI,在上面画一个圆圈或一张脸,当用户点击按钮时,我给了用户改变面部特征的选项,我已经完成了基本布局,但现在我想在我的GUI的主面板上画一个圆圈,我创建了另一个扩展JPanel的文件,我创建了paintComponent方法,并在主应用程序上调用它,但它不会得到一个圆,而是在主面板的顶部得到一个小正方形,我已经对大小进行了调整,但无论我做什么更改,仍然会给我相同的东西,我不知道我错过了什么如果我能得到一些帮助我会很感激它和一些建议。。先谢谢你 这是我的JPanel

我正在做一项任务,我创建了一个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
类:

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);      
    }
}
将面组件添加到使用FlowLayout的面板中。FlowLayout尊重添加到其中的任何组件的首选尺寸。在您的情况下,首选大小为(0,0),因此布局管理器无法正确执行其工作

您需要重写类的
getPreferredSize()
方法以返回组件的首选大小,在您的情况下,该大小可能是(190210),因此椭圆形在面板中居中

您可以阅读上Swing教程中的部分,以获得一个演示如何实现此方法的工作示例。将教程的链接放在手边,因为它包含许多Swing基础知识的示例

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

您需要重写类的
getPreferredSize()
方法以返回组件的首选大小,在您的情况下,该大小可能是(190210),因此椭圆形在面板中居中


您可以阅读上Swing教程中的部分,以获得一个演示如何实现此方法的工作示例。将教程的链接放在手边,因为它包含许多Swing基础知识的示例。

嘿,它工作了,我忘了它的流程布局了,非常感谢!!嘿,我忘了它的流程布局了,非常感谢!!
mainPanel.add(face);