我需要展示棋盘。我有一个扩展JPanel的BoardPanel类和一个包含BoardPanel的GamePanel(也扩展了JPanel)类。 GamePanel填充了所有应用程序框架。

我希望BoardPanel始终是一个正方形,其大小等于GamePanel的宽度和高度的最小值(如果GamePanel的宽度大于高度,则左右应有空白,如果较小,则顶部和底部应有空白) )。将BoardPanel显示在父面板的中心也很重要。

我这样写:

public GamePanel() {
    setLayout(new BorderLayout(0, 0));
    boardPanel = new BoardPanel(...);
    this.add(boardPanel, BorderLayout.CENTER);
    ...
}


在BoardPanel中:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    int size = Math.min(this.getParent().getHeight(), this.getParent().getWidth());
    this.setSize(size, size);
    ...
}


它的大小可以调整,但是棋盘总是显示在GamePanel的左上角(所有空白区域显示在bot或右边),我不知道如何解决。

有什么帮助吗?提前致谢!

最佳答案

使用GridBagLayout将其居中。



import java.awt.*;
import javax.swing.*;

public class CenteredPanel {

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                JPanel gui = new JPanel(new GridBagLayout());
                JPanel square = new SquarePanel();
                square.setBackground(Color.RED);
                gui.add(square);

                JFrame f = new JFrame("SquareBoard");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setLocationByPlatform(true);
                f.add(gui);
                f.setMinimumSize(new Dimension(400,100));
                f.pack();
                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

class SquarePanel extends JPanel {
    @Override
    public Dimension getPreferredSize() {
        Container c = this.getParent();
        int size = Math.min(c.getHeight(), c.getWidth());
        Dimension d = new Dimension(size,size);
        return d;
    }
}

10-01 05:15