Java Swing JPanel.add不会将组件添加到面板中

Java Swing JPanel.add不会将组件添加到面板中,java,swing,Java,Swing,我不熟悉Java Swing。因此,我面临向主窗口添加组件的问题 这是我的密码 public class MainFrame extends JFrame { public MainFrame(){ setTitle("Tetris"); JComponent gamePanel = new GamePanel(); add(gamePanel); setDefaultCloseOperation(JFrame.EXIT_

我不熟悉Java Swing。因此,我面临向主窗口添加组件的问题

这是我的密码

public class MainFrame extends JFrame {

    public MainFrame(){
        setTitle("Tetris");
        JComponent gamePanel = new GamePanel();
        add(gamePanel);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 600);
        setVisible(true);
    }
}

public class GamePanel extends JPanel {
    public GamePanel(){
        setLayout(new BorderLayout());
        setBackground(Color.white);
        add(new Ball(), BorderLayout.NORTH);
        add(new StartButton(), BorderLayout.SOUTH);
    }
}

public class Ball extends JComponent {
    @Override
    protected void paintComponent(Graphics g) {
        Graphics2D graphics2D = (Graphics2D)g;
        graphics2D.setColor(Color.RED);
        graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        graphics2D.fillOval(40,40,10,10);
    }
}

当我调用main方法new MainFrame()时,我得到的窗口只有一个按钮。没有球。你能帮我吗?

将球放在
BorderLayout.CENTER
而不是
BorderLayout.North
@Marc\u Alx如果你将球放在
BorderLayout.North
中,它将使用默认大小,即零。将其放置在
BorderLayout.CENTER
中会使其展开以填充面板

如果您确实希望它位于
BorderLayout.North
中,那么您应该为球创建一个构造函数来设置其首选大小

还要注意,Ball的
paintComponent()
方法的第一行应该是

super.paintComponent(g);

确保在将球移动到其他位置时渲染正确的背景色,并删除旧球图像。

球的构造器在哪里?您只调用了一些超级方法,而没有调用构造函数。