我正在开发我的第一个Java Swing项目(真的是我的第一个GUI项目,除非你算上客户端的Web编程),而且我有一个美学问题。我正在JPanel中制作一个Sudoku棋盘。该面板使用3x3 GridLayout布局,其九个单元格中的每一个都包含JPanel,另外还有3x3 GridLayout。外部网格具有较宽的边框以指示数独板的“框”,内部网格较薄的边框以显示“单元格”(here's a screenshot如果需要帮助可视化它)。
问题在于我在内部和外部网格的边界之间获得了额外的空间,这看起来很糟糕。我已经尝试明确地将insets设置为零,这没有做任何事情。我能想到解决它的唯一方法是完全消除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的这类问题并找到解决方案?任何帮助都会非常感激,我已经把头发拉过来超过一天了。
答案 0 :(得分:3)
似乎是窗口大小的问题。假设外面板内有2个水平面板。外部窗格的边框大小为2,内部小区的边框大小为1.
如果窗口的大小为18,我们有
所以没有空间,两个内部面板都有相同的尺寸
如果出于某种原因将窗口大小更改为19,则需要在面板之间创建间隙以保持相同大小的窗口大小。
如果尺寸为20,则两个面板的尺寸均为+1,并且不需要间隙。
要解决此问题,您可以使用固定大小的窗口(您知道的窗口没有间隙),或者在调整窗口大小时向外部面板添加填充,以便填充使框架的其余部分具有大小没有间隙。 (在你的情况下,如果我的数学很好,应该是20 + x / 3)
如果要放弃使用嵌套面板并在具有焦点时更改单元格边框,则每个单元格都需要一个LineBorder实例。在您的代码中,所有单元格都使用相同的LineBorder实例。