gpt4 book ai didi

java - JPanel 和 JLabels 拉伸(stretch)以适应父级的大小,无论最大大小如何 - java wordle clone

转载 作者:行者123 更新时间:2023-12-05 01:51:15 25 4
gpt4 key购买 nike

在扩展 JFrame 的类中,我有以下代码:

public Frame() {
setTitle("WORDLE");

// creates all containers
Container mainContainer = getContentPane();
JPanel gridContainer = new JPanel();
JPanel optionsContainer = new JPanel();

// sets size of main frame
setSize(WIDTH, 900);

// sets background size and background colors of all containers
gridContainer.setBackground(GameTheme.BACKGROUND); // TODO: add message label inside of gridContainer below grid JPanel
gridContainer.setPreferredSize(new Dimension(WIDTH - 150, 500));
gridContainer.setMaximumSize(new Dimension(WIDTH - 150, 500));
gridContainer.setLayout(new BorderLayout(10, 0));

optionsContainer.setBackground(GameTheme.BACKGROUND);
optionsContainer.setPreferredSize(new Dimension(WIDTH, 100));

// creates grid with boxes for letter
grid = new JPanel();
grid.setLayout(new GridLayout(6, 5, 5, 5));

grid.setPreferredSize(new Dimension(WIDTH - 150, 400));
grid.setMaximumSize(new Dimension(WIDTH - 150, 400));

grid.setBackground(GameTheme.BACKGROUND);
createBoxes();

// JLabel for messages
JLabel alertLabel = new JLabel("test");
alertLabel.setOpaque(true);
alertLabel.setForeground(GameTheme.WHITE);
alertLabel.setBackground(GameTheme.BACKGROUND);

// listens for presses in the JFrame, with the Game class implementing the method for the keypress event
addKeyListener(new Game(boxes));

// lays out all containers and their sub-containers
// title label at top, grid container at center, options container at bottom
mainContainer.setLayout(new BorderLayout());
mainContainer.add(createTitle(), BorderLayout.NORTH); // createTitle returns a JLabel
mainContainer.add(gridContainer, BorderLayout.CENTER);
mainContainer.add(optionsContainer, BorderLayout.SOUTH);
gridContainer.add(grid, BorderLayout.NORTH);
gridContainer.add(alertLabel, BorderLayout.SOUTH);

// boilerplate frame configuration
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
setLocationRelativeTo(null);
pack();
setVisible(true);
}

public void createBoxes() {
// initializes 2d array for letter boxes
boxes = new LetterBox[6][5];

// populates 2d array and adds boxes to the grid container
for (int r = 0; r < 6; r++) {
for (int c = 0; c < 5; c++) {
LetterBox letterBox = new LetterBox(r, c);
boxes[r][c] = letterBox;
grid.add(letterBox.getBox());
}
}
}

我已经为 gridContainer 中的所有组件设置了最大尺寸,甚至在 gridContainer 本身上,但 JLabel 仍在拉伸(stretch)以占据图形用户界面。谁能帮我弄清楚为什么会这样,我该如何解决?

为了弄清楚问题,这里有一些图片显示了我想要的与我得到的:

预期: expected result

实际: actual result

我尽量描述得尽可能清楚,如果有什么需要澄清的,请发表评论并告诉我。

最佳答案

不要一直玩弄父面板和框架的首选/最小/最大尺寸。每个面板都应该能够根据添加到面板的组件的首选大小来计算其首选大小。因此,您将组件添加到面板,并将面板添加到框架,然后打包框架,所有内容都将以适当的大小显示。

因此,在您的情况下,您可以为“gridContainer”使用 GridLayout。然后将 JLabel 添加到 gridContainer。对于您的 LetterBox 组件,您应该使用“等宽”字体,这样所有字符都将占用相同的空间。然后您可以使用默认值 ""初始化您的标签,为标签指定大小。

此尺寸太小,因此您还需要向 LetterBox 添加一个 EmptyBorder。所以在构造函数中你可以添加如下内容:

setBorder( new EmptyBorder(10, 10, 10, 10) );

现在 LeterBox 可以正确计算其首选大小,“gridContainer”将能够正确计算其首选大小。

但是,当您将面板添加到 BorderLayout 的 CENTER 时,BorderLayout 将尝试调整每个组件的大小以填充框架中的可用空间。为防止这种情况,您可以使用“包装器”面板:

JPanel wrapper = new JPanel(); // uses FlowLayout by default
wrapper.add( gridContainer );
mainContainer.add(wrapper, BorderLayout.CENTER);
//mainContainer.add(gridContainer, BorderLayout.CENTER);

现在,如果调整框架的大小,额外的空间将转到包装器面板而不是 gridContainer。

关于java - JPanel 和 JLabels 拉伸(stretch)以适应父级的大小,无论最大大小如何 - java wordle clone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72419315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com