我正在使用3 JPanels
生成一个棋盘,其中包含以下GridLayout
s:
我正在使用可调整大小的JFrame来完全包含它。我实际使用了this code,稍加修改。
这意味着,在填充三个面板后,将它们添加到主JFrames面板,如下所示:
Container contentPanel = getContentPane();
/**Create some panels**/
JPAnel 8x8 = new JPanel();
8x8.setLayout(new GridLayout(8, 8));
JPAnel 1x8 = new JPanel();
8x8.setLayout(new GridLayout(1, 8));
JPAnel 8x1 = new JPanel();
8x8.setLayout(new GridLayout(8, 1));
/**Populate frames**/
...
/**Assign frames**/
contentPanel.add(8x8, BorderLayout.CENTER);
contentPanel.add(8x1, BorderLayout.SOUTH);
contentPanel.add(1x8, BorderLayout.WEST);
这并不是那么糟糕,但它看起来仍然如此:
底线扩展到垂直线。窗口越大,这个问题就越明显。
我想将标记线粘贴到棋盘上,这样每个数字都会与适当的线对齐。
我尝试将2x2布局分配给父框架contentPanel
但是,网格布局似乎要求所有元素都具有相同的大小,因此它只会为8x1
和{{1}创建更大的区域}。
我的方法:
1x8
但结果更糟:
那我如何使用那些醉酒的网格布局呢? 或者我应该以不同的方式开始?
修改
使用contentPanel.setLayout(new GridLayout(2, 2));
contentPanel.add(1x8); //vertical markers first
contentPanel.add(8x8); //Then the chessboard
//Create empty placeholder for bottom-right corner
JPanel empty = new JPanel();
contentPanel.add(empty);
//finally add bottom markers
contentPanel.add(2x1);
:
gridBaglayout
结果:
稍微玩了一下后:
contentPanel.setLayout(new GridBagLayout());
/**Follows as after contentPanel.setLayout(new GridLayout(2, 2)); in the prewious code**/
它不会尝试适合窗口:
答案 0 :(得分:4)
您可以使用9x9
网格进行条件检查。这将使事情变得更简单和更好。使用条件检查可能生成此类布局可能如下:
GridLayout layout = new GridLayout(0,9);
jPanel1.setLayout(layout);
for(int row =0; row < 9; row++)
for(int col=0; col<9;col++)
{
JButton button = new JButton();
if(col==0 && row==8)
{ button.setEnabled(false);
button.setContentAreaFilled(false);
}
else if(col==0)
button.setText(""+(char)('A'+row));
else if(row == 8)
button.setText(""+(char)('A'+col - 1));
else if(col%2==0)
button.setBackground(Color.white);
else button.setBackground(Color.black);
jPanel1.add(button);
}
它的输出如下:
答案 1 :(得分:0)
也将gridBagLayout
设为contentPane
。这会将您的面板放置在所需的位置。
答案 2 :(得分:0)
要么使用9x9的一个面板(数字会与每个字段一样大)或使用GridBagLayout,这将为您提供完全控制。也就是说,GridBagLayout
是一个完整的PITA。也许TableLayout更符合您的喜好。