1

我需要显示棋盘。我有一个扩展 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 的左上角(所有空白区域都显示在机器人或右侧),我不知道如何修复它。

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

4

2 回答 2

4

使用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;
    }
}
于 2012-12-05T07:37:28.027 回答
2
  • 无需new BorderLayout(0,0)简单地使用默认构造函数BorderLayout

  • 不要像这样调用而setSize()不是覆盖:getPreferredSize()JPanel

    @Override
    public void getPreferredSize() {
    
            int size = Math.min(this.getParent().getHeight(), this.getParent().getWidth());
    
           return new Dimension(size,size);
    }
    
  • 在你的工作中也没有什么好处,paintComponent因为这应该只用于绘画。

如果上述方法不起作用,我建议您使用SSCCE来说明您可能遇到的具体问题

于 2012-12-05T06:39:35.107 回答