Jes*_*ssy 17 java swing grid-layout
我们如何在GridLayout中显示网格线?在Java?
JPanel panel = new JPanel(new GridLayout(10,10));
panel.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
for (int i =0; i<(10*10); i++){
panel.add(new JLabel("Label"));
}
Run Code Online (Sandbox Code Playgroud)
Joe*_*han 17
我会尝试通过在添加组件时为组件添加边框来实现.这样做的简单方法就是使用BorderFactory.createLineBorder(),如下所示:
JPanel panel = new JPanel(new GridLayout(10,10));
panel.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
for (int i =0; i<(10*10); i++){
final JLabel label = new JLabel("Label");
label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
panel.add(label);
}
Run Code Online (Sandbox Code Playgroud)
但是,这将使您在单元格之间的边框比在面板边缘处更厚,因为外边缘将只有一个像素的粗边框,而内边缘将具有两个一个像素的粗边框.要解决此问题,您可以使用BorderFactory.createMatteBorder()仅在任何地方绘制一个像素宽的边框:
final int borderWidth = 1;
final int rows = 10;
final int cols = 10;
JPanel panel = new JPanel(new GridLayout(rows, cols));
panel.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
final JLabel label = new JLabel("Label");
if (row == 0) {
if (col == 0) {
// Top left corner, draw all sides
label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
}
else {
// Top edge, draw all sides except left edge
label.setBorder(BorderFactory.createMatteBorder(borderWidth,
0,
borderWidth,
borderWidth,
Color.BLACK));
}
}
else {
if (col == 0) {
// Left-hand edge, draw all sides except top
label.setBorder(BorderFactory.createMatteBorder(0,
borderWidth,
borderWidth,
borderWidth,
Color.BLACK));
}
else {
// Neither top edge nor left edge, skip both top and left lines
label.setBorder(BorderFactory.createMatteBorder(0,
0,
borderWidth,
borderWidth,
Color.BLACK));
}
}
panel.add(label);
}
}
Run Code Online (Sandbox Code Playgroud)
这应该为您提供宽度边界borderWidth,无论是在单元格之间还是在外边缘之间.
对于Joe Carnahan提到的粗边界问题,可以更容易地解决:GridLayout(10,10, -1, -1)将垂直间隙和组件之间的水平间隙设置为-1.所以完整的代码是:
JPanel panel = new JPanel(new GridLayout(10,10, -1, -1));
panel.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
for (int i =0; i<(10*10); i++){
final JLabel label = new JLabel("Label");
label.setBorder(BorderFactory.createLineBorder(Color.BLACK));
panel.add(label);
}
Run Code Online (Sandbox Code Playgroud)
我找到了一个非常简单的解决方案:
final GridBagLayout layout = new GridBagLayout();
JPanel content = new JPanel(layout)
{
@Override
public void paint(Graphics g)
{
super.paint(g);
int[][] dims = layout.getLayoutDimensions();
g.setColor(Color.BLUE);
int x = 0;
for (int add : dims[0])
{
x += add;
g.drawLine(x, 0, x, getHeight());
}
int y = 0;
for (int add : dims[1])
{
y += add;
g.drawLine(0, y, getWidth(), y);
}
}
};
Run Code Online (Sandbox Code Playgroud)
编辑:对于此解决方案,我只是重写了paint()JPanel 的方法,并按照GridBagLayout.getLayoutDimensions()手动在JPanel自己的图像上定义的方式绘制了网格。