为什么网格不遵守约束?

Why grid doesn't respect the constraint?

我不明白 GridBagLayout。这是解释的截图

对于JTextField "Janvier", gridy = 0, gridx = 1 and **gridwidth = 5**

对于JTextField "Février", gridy = 0, gridx = 5 and gridwidth = 4

为周数1, 2, 3 and 4 : gridy = 1, gridx = 0, 1, 2 and 3, and gridwidth = 1

对于周数5 : gridy = 1, gridx = 4 and gridwidth = 2.

事实上,我想在 "Janvier" 和 "Février" JTextField 下进行第 5 周。

你怎么看这件事?我是不是忘记了什么?

谢谢。

编辑:抱歉,我的解释有误。第一个 JTextField "Janvier" 有 gridx = 0.

这是一张带有代码的新截图: enter image description here

            JPanel pan = new MyGridBagPan();
            GridBagConstraints c = new GridBagConstraints();
            c.fill = GridBagConstraints.BOTH;
            c.gridheight = 1;
            c.gridwidth = 5;
            c.gridx = 0;
            c.gridy = 0;

            JTextField field = new MyLeftField("Janvier", "", 5, 14, Color.DARK_GRAY, Font.PLAIN, Color.WHITE, false);
            pan.add(field, c);
            c.gridwidth = 1;
            c.gridx = 0;
            c.gridy++;
            field = new MyLeftField("1", "", 2, 14, Color.DARK_GRAY, Font.PLAIN, Color.WHITE, false); 
            pan.add(field, c);
            c.gridx++;          
            field = new MyLeftField("2", "", 2, 14, Color.DARK_GRAY, Font.PLAIN, Color.WHITE, false); 
            pan.add(field, c);
            c.gridx++;          
            field = new MyLeftField("3", "", 2, 14, Color.DARK_GRAY, Font.PLAIN, Color.WHITE, false); 
            pan.add(field, c);
            c.gridx++;          
            field = new MyLeftField("4", "", 2, 14, Color.DARK_GRAY, Font.PLAIN, Color.WHITE, false); 
            pan.add(field, c);
            c.gridy = 0;
            c.gridx = 5;            
            c.gridwidth = 5;
            field = new MyLeftField("Février", "", 0, 14, Color.DARK_GRAY, Font.PLAIN, Color.WHITE, false);
            pan.add(field, c);
            c.gridwidth = 2;
            c.gridx = 4;
            c.gridy = 1;
            field = new MyLeftField("5", "", 2, 14, Color.DARK_GRAY, Font.PLAIN, Color.WHITE, false); 
            pan.add(field, c);
            c.gridwidth = 1;
            c.gridx+=2;         
            field = new MyLeftField("6", "", 2, 14, Color.DARK_GRAY, Font.PLAIN, Color.WHITE, false); 
            pan.add(field, c);
            c.gridx++;          
            field = new MyLeftField("7", "", 2, 14, Color.DARK_GRAY, Font.PLAIN, Color.WHITE, false); 
            pan.add(field, c);
            c.gridx++;          
            field = new MyLeftField("8", "", 2, 14, Color.DARK_GRAY, Font.PLAIN, Color.WHITE, false); 
            pan.add(field, c);
            c.gridx++;          
            field = new MyLeftField("9", "", 2, 14, Color.DARK_GRAY, Font.PLAIN, Color.WHITE, false); 
            pan.add(field, c);
            JOptionPane.showOptionDialog(null, pan
                    , "test", JOptionPane.DEFAULT_OPTION, JOptionPane.DEFAULT_OPTION, null, null, null);

For the week number 5 : gridy = 1, gridx = 4 and gridwidth = 2.

在您的示例中,第二行只有 7 个组件。每个组件占据一列。

默认情况下,如果没有向列添加任何组件,则列的默认大小为 0,因此您不能只说一个组件占用两个单元格,因为 GridBagLayout 不知道第二列应该是。

如果您希望第 5 周占据两列,那么您确实需要创建一个包含 8 列的网格。

这可以通过添加如下代码来完成:

GridBagLayout gbl = new GridBagLayout();
yourPanel.setLayout( gbl );

//  Set up a grid with 8 columns.
//  The minimum width of a column is 50 pixels

int[] columns = new int[8];
Arrays.fill(columns, 50);
gbl.columnWidths = columns;

现在 GridBagLayout 知道了没有实际组件的任何列的列宽。

因此,第 5 周按钮应同时位于 Janvier 和 Fevrier 下方。

有关使用此基本方法的完整工作示例,请参阅: