gpt4 book ai didi

java - JPanel:嵌套 GridLayout 表的边框之间的额外空间

转载 作者:行者123 更新时间:2023-12-04 04:56:28 25 4
gpt4 key购买 nike

我正在开发我的第一个 Java Swing 项目(实际上是我的第一个 GUI 项目,除非您计算客户端 Web 编程),但我遇到了审美问题。我正在 JPanel 中制作数独板。该面板采用 3x3 GridLayout 布局,其中包含 JPanel 的九个单元格中的每一个都填充了另一个 3x3 GridLayout。外部网格有更宽的边框来表示数独棋盘的“框”,而内部网格有更细的边框来显示“单元格”(here's a screenshot,如果您需要帮助进行可视化)。

问题是我在内部和外部网格的边界之间获得了额外的空间,这看起来很糟糕。我已经尝试将插图明确设置为零,但没有做任何事情。我想修复它的唯一方法是完全消除 GridLayout 嵌套,而是使用一个 9x9 网格,在适当的情况下将单个单元格边框设置为在顶部/底部/左侧/右侧更厚;但是,每个单元格的边框在获得焦点时都会改变颜色和粗细,我想不出一种优雅的方式来实现该策略。我也一直在研究其他布局,但 GridLayout 似乎非常适合这个目的(每个单元格应该是相同的大小)。

这是 BoardPanel 的构造函数(扩展 JPanel),我试图省略任何无关的代码:

BoardPanel(Board newBoardData)
{
/**
* Instance variable initializations, call to super(), etc. omitted.
*/

// Outer grid initialization
// In pictures, .getBoxWidth() and .getBoxHeight both return (int)3
setLayout(new GridLayout(boardData.getBoxWidth(), boardData.getBoxHeight(), 0, 0));
setBorder(new LineBorder(colorGridBorders, 2));

// Inner grid array; .getBoardSize() returns (int)9
JPanel innerBoxGridPanels[] = new JPanel[boardData.getBoardSize()];
GridLayout innerBoxGridLayout = new GridLayout(boardData.getBoxHeight(), boardData.getBoxWidth(), 0, 0);
LineBorder innerBoxLineBorder = new LineBorder(colorGridBorders, 1);

for (int columnIndex = 0; columnIndex < boardData.getBoardSize(); ++columnIndex)
{
for (int rowIndex = 0; rowIndex < boardData.getBoardSize(); ++rowIndex)
{
// CellPanel derives from JPanel; has a call to setBorder() to create inner grid lines
cellPanes[columnIndex][rowIndex] = new CellPanel(columnIndex, rowIndex, boardData.getCell(columnIndex, rowIndex));
}
}

for (int box = 0; box < boardData.getBoardSize(); ++box)
{
// Inner grid initialization
innerBoxGridPanels[box] = new JPanel(innerBoxGridLayout);
innerBoxGridPanels[box].setBorder(innerBoxLineBorder);

// Adding cells to inner grid
for (int cell = 0; cell < boardData.getBoardSize(); ++cell)
{

innerBoxGridPanels[box].add(cellPanes
[( cell % boardData.getBoxWidth() )
+ ( ( box % boardData.getBoxHeight() ) * boardData.getBoxWidth() )]
[( cell / boardData.getBoxWidth() )
+ ( (box / boardData.getBoxHeight() ) * boardData.getBoxHeight() ) ]);
}

// Adding inner grids to outer grid
add(innerBoxGridPanels[box]);
}
}

Here's a screenshot各种尺寸的渲染板。在右上角的图像中,您可以看到,如果您将窗口大小调整得恰到好处,您可以消除大部分额外空间(尽管边缘仍有一些空间)。

有没有人在嵌套的 GridLayouts 之前遇到过这种问题并找到了解决方案?任何帮助将不胜感激,我已经为此拉了一天多的头发。

最佳答案

好像是窗口大小的问题。假设在外面板内有 2 个水平面板。外面板的边框尺寸为 2,内面板的边框尺寸为 1。

例如,如果窗口的大小为 18,我们有

  • 外边框为 2px
  • 内边框为 1px
  • 面板内容为 5px
  • 内边框为 1px
  • 内边框为 1px
  • 面板内容为 5px
  • 内边框为 1px
  • 外边框为 2px

  • 所以没有空间,两个内板的尺寸相同

    如果出于某种原因将窗口大小更改为 19,则需要在面板之间创建间隙以保持它们的大小相等。

    如果尺寸为 20,则两个面板的尺寸都为 +1,并且不需要间隙。

    要解决此问题,您可以使用固定大小的窗口(您知道没有间隙的窗口),或者在调整窗口大小时向外面板添加填充,以便填充使框架的其余部分具有不产生任何间隙的大小差距。 (在你的情况下,如果我的数学很好,应该是 20 + x/3)

    如果要放弃使用嵌套面板并在获得焦点时更改单元格边框,则每个单元格都需要一个 LineBorder 实例。在您的代码中,所有单元格都使用相同的 LineBorder 实例。

    关于java - JPanel:嵌套 GridLayout 表的边框之间的额外空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16696854/

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