将布局为 GridLayout 的 JPanel 居中放置在另一个 JPanel 中
Center a JPanel with layout GridLayout inside another JPanel
我正在尝试制作国际象棋游戏,并在尝试使用 GUI 时遇到了这个问题:
我似乎无法在我的 JFrame
上将我的棋盘垂直居中。 JPanel
水平居中,但它偏离中心,垂直贴在顶部。
将使用 GridLayout
的面板添加到其容器并初始化框架的代码:
public class ChessGUI extends JFrame
{
private static final long serialVersionUID = 1L;
private static Dimension appDimention = new Dimension(1000, 600);
public static JFrame frame = new JFrame("Chess");
public static JPanel background = new JPanel();
public static BoardGUI board = new BoardGUI();
public static int width;
public static int height;
public static void createFrame()
{
JFrame.setDefaultLookAndFeelDecorated(true);
//Set stuff that JFrame needs
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
//Set stuff that JPanel needs
background.setPreferredSize(appDimention);
frame.getContentPane().add(background);
frame.pack();
//This 'board' is my Chess Board JPanel which I can't seem to centre
//'background' is a JPanel which is, as the name suggests, the background
background.add(board);
//Set the location of the JFrame and set it visible
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
BoardGUI
@SuppressWarnings("serial")
public class BoardGUI extends JPanel
{
GridLayout chessBoard = new GridLayout(8, 8);
Dimension boardDims = new Dimension(500, 500);
public BoardGUI()
{
this.setLayout(chessBoard);
this.setBackground(Color.BLACK);
this.setPreferredSize(boardDims);
}
}
我并没有在上面的代码中做任何事情来使 BoardGUI
对象居中,但我确实尝试了以下两种方法,但结果是否定的:
background.add(board, JPanel.CENTER_ALLIGNMENT)
background.add(board, BorderLayout.CENTER)
我目前得到的结果:
如您所见,它没有垂直居中,我希望它在框架上水平和垂直居中。
非常欢迎对我可能犯的任何错误提供任何帮助或见解!谢谢!
background
是一个 JPanel
,其默认布局为 FlowLayout
,这就是您的问题所在。
我会改变
public static JPanel background = new JPanel();
到
public static JPanel background = new JPanel(new GridBagLayout());
建议...
好的,所以建议。
- 避免
static
,尤其是如果您只想从一个 class 访问另一个信息时 - 有更好的方法可以实现这一点,不会与您的代码紧密耦合
- 避免使用
setPreferredSize
- 这不是定义自定义尺寸提示的推荐方式,而是覆盖 getPreferredSize
,这样可以防止其他人更改它。
- 我不会设置
background
面板的 preferredSize
,而是简单地使用 EmptyBorder
或 GridBagLayout
的 margins/inserts 支持
我正在尝试制作国际象棋游戏,并在尝试使用 GUI 时遇到了这个问题:
我似乎无法在我的 JFrame
上将我的棋盘垂直居中。 JPanel
水平居中,但它偏离中心,垂直贴在顶部。
将使用 GridLayout
的面板添加到其容器并初始化框架的代码:
public class ChessGUI extends JFrame
{
private static final long serialVersionUID = 1L;
private static Dimension appDimention = new Dimension(1000, 600);
public static JFrame frame = new JFrame("Chess");
public static JPanel background = new JPanel();
public static BoardGUI board = new BoardGUI();
public static int width;
public static int height;
public static void createFrame()
{
JFrame.setDefaultLookAndFeelDecorated(true);
//Set stuff that JFrame needs
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
//Set stuff that JPanel needs
background.setPreferredSize(appDimention);
frame.getContentPane().add(background);
frame.pack();
//This 'board' is my Chess Board JPanel which I can't seem to centre
//'background' is a JPanel which is, as the name suggests, the background
background.add(board);
//Set the location of the JFrame and set it visible
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
BoardGUI
@SuppressWarnings("serial")
public class BoardGUI extends JPanel
{
GridLayout chessBoard = new GridLayout(8, 8);
Dimension boardDims = new Dimension(500, 500);
public BoardGUI()
{
this.setLayout(chessBoard);
this.setBackground(Color.BLACK);
this.setPreferredSize(boardDims);
}
}
我并没有在上面的代码中做任何事情来使 BoardGUI
对象居中,但我确实尝试了以下两种方法,但结果是否定的:
background.add(board, JPanel.CENTER_ALLIGNMENT)
background.add(board, BorderLayout.CENTER)
我目前得到的结果:
如您所见,它没有垂直居中,我希望它在框架上水平和垂直居中。
非常欢迎对我可能犯的任何错误提供任何帮助或见解!谢谢!
background
是一个 JPanel
,其默认布局为 FlowLayout
,这就是您的问题所在。
我会改变
public static JPanel background = new JPanel();
到
public static JPanel background = new JPanel(new GridBagLayout());
建议...
好的,所以建议。
- 避免
static
,尤其是如果您只想从一个 class 访问另一个信息时 - 有更好的方法可以实现这一点,不会与您的代码紧密耦合 - 避免使用
setPreferredSize
- 这不是定义自定义尺寸提示的推荐方式,而是覆盖getPreferredSize
,这样可以防止其他人更改它。 - 我不会设置
background
面板的preferredSize
,而是简单地使用EmptyBorder
或GridBagLayout
的 margins/inserts 支持