如何将 JPanel 添加到 JFrame 的中心?

How to add a JPanel to the center of a JFrame?

我尝试创建一个 JFrame,其中有一个 JPanel(包含一个圆圈),它的边界是四个按钮(北、南、东、西)。圆圈将按照按下的按钮指示的方向移动。
我的问题是我无法将我的 JPanel 放在中心:

JFrame 的 class 看起来像这样:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

@SuppressWarnings("serial")
public class Frame extends JFrame implements ActionListener {

JButton north, south, east, west;
int x = 10, y = 10;
MyPanel panel;

public Frame() {
    setLayout(new BorderLayout());
    panel = new MyPanel();
    panel.setBackground(Color.MAGENTA);

    north = new JButton("NORTH");
    south = new JButton("SOUTH");
    east = new JButton("EAST");
    west = new JButton("WEST");

    add(panel, BorderLayout.CENTER);
    add(north, BorderLayout.NORTH);
    add(south, BorderLayout.SOUTH);
    add(east, BorderLayout.EAST);
    add(west, BorderLayout.WEST);

    north.addActionListener(this);
    south.addActionListener(this);
    east.addActionListener(this);
    west.addActionListener(this);

    setBounds(100, 100, 300, 300);
    setVisible(true);
}

@Override
public void actionPerformed(ActionEvent e) {
    if (e.getSource() == north) {
        y -= 3;
        panel.setY(y);
        panel.repaint();
    }

    if (e.getSource() == south) {
        y += 3;
        panel.setY(y);
        panel.repaint();
    }

    if (e.getSource() == east) {
        x += 3;
        panel.setX(x);
        panel.repaint();
    }

    if (e.getSource() == west) {
        x -= 3;
        panel.setX(x);
        panel.repaint();
    }
}
}

MyPanel class 看起来像这样:

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

@SuppressWarnings("serial")
public class MyPanel extends JPanel {
private Color color = Color.CYAN;
private int x = 10, y = 10;

public void paint(Graphics g) {
    super.paintComponent(g);
    g.setColor(color);
    g.fillOval(x, y, 20, 20);
}

public int getX() {
    return x;
}

public void setX(int x) {
    this.x = x;
}

public int getY() {
    return y;
}

public void setY(int y) {
    this.y = y;
}
}

不要覆盖自定义面板的 getX()getY() 方法。 Swing 使用这些方法来确定组件的位置。

相反,您应该使用 setCirleX(...)setCircleY(...)getCircleX()getCircleY().

等方法