Java Swing GridBagLayout

Java Swing GridBagLayout,java,swing,gridbaglayout,Java,Swing,Gridbaglayout,我正在编写一个JavaGUI来模拟一些文书工作,特别是一个表单,它有许多“行”,只有在运行时才知道,这些行或者被分成两部分(50%-50%,一个标签和一个条目),或者被分成25%-75%,(比如说一个数字和一个完整的句子) 有人会认为,已经说过(这里只显示突出的行,下面是更完整的代码) 其次是: c.gridx = 2; c.gridwidth = 4; ... mainPanel.add(l, c); c.gridx = 1; c.gridwidth = 3; ... mainPanel.a

我正在编写一个JavaGUI来模拟一些文书工作,特别是一个表单,它有许多“行”,只有在运行时才知道,这些行或者被分成两部分(50%-50%,一个标签和一个条目),或者被分成25%-75%,(比如说一个数字和一个完整的句子)

有人会认为,已经说过(这里只显示突出的行,下面是更完整的代码)

其次是:

c.gridx = 2;
c.gridwidth = 4;
...
mainPanel.add(l, c);
c.gridx = 1;
c.gridwidth = 3;
...
mainPanel.add(l, c);
将“确定”在x方向,面板分为4个,给我50-50,这将使我可以自由地这样做,以获得我的25%-75%版本:

GridBagConstraints c = new GridBagConstraints();
...
c.gridx = 0;
c.gridwidth = 1;
...
mainPanel.add(l, c);
其次是:

c.gridx = 2;
c.gridwidth = 4;
...
mainPanel.add(l, c);
c.gridx = 1;
c.gridwidth = 3;
...
mainPanel.add(l, c);
但我得到的是所有的线被50-50分开。我能够将行划分为50-50,然后其他行不划分,这对于初步版本来说是可以的

我是否误解了这里的工作方式?我注意到这篇文章的“类似问题”侧栏(http://stackoverflow.com/questions/7509781/java-gridbaglayout-automated-construction)推荐MIG布局,我会认真考虑。< /P> 相关代码如下,项目的其余部分是一个标准的空NetBeans Java桌面应用程序:

public class GridBagDemoView extends FrameView {
public GridBagDemoView(SingleFrameApplication app) {
    super(app);

    initComponents();

    // Reset the grid position
    nextGridY = 0;


    addLine_50_50("50", "50");
    addLine_50_50("50", "50");
    addLine_50_50("50", "50");
    addLine_50_50("50", "50");

    addLine_25_75("25", "75");
    addLine_25_75("25", "75");
    addLine_25_75("25", "75");
    addLine_25_75("25", "75");


    mainPanel.validate();
    mainPanel.revalidate();
    mainPanel.repaint();

}

private void addLine_50_50(String left, String right) {

    GridBagConstraints c = new GridBagConstraints();

    // "Universal" settings
    c.fill = GridBagConstraints.HORIZONTAL;
    c.insets = new Insets(5, 5, 5, 5);
    c.anchor = GridBagConstraints.NORTHWEST;
    c.gridheight = 1;
    c.weightx = 1;
    c.weighty = 1;

    // Settings for the labels (LHS of panel)
    JTextArea l = new JTextArea();
    l.setText(left);
    c.gridx = 0;
    c.gridy = nextGridY;
    c.gridwidth = 2;
    c.weightx = 1;
    mainPanel.add(l, c);

    // Settings for the text (RHS of panel)
    JTextArea ta = new JTextArea();
    ta.setText(right);
    c.gridx = 2;
    c.gridy = nextGridY;
    c.gridwidth = 2;
    c.weightx = 1;
    mainPanel.add(ta, c);

    // Increase row number of next line
    nextGridY++;
}

private void addLine_25_75(String left, String right) {

    GridBagConstraints c = new GridBagConstraints();

    // "Universal" settings
    c.fill = GridBagConstraints.HORIZONTAL;
    c.insets = new Insets(5, 5, 5, 5);
    c.anchor = GridBagConstraints.NORTHWEST;
    c.gridheight = 1;
    c.weighty = 1;

    // Settings for the labels (LHS of panel)
    JTextArea l = new JTextArea();
    l.setText(left);
    c.gridx = 0;
    c.gridy = nextGridY;
    c.gridwidth = 1;
    c.weightx = 1;
    mainPanel.add(l, c);

    // Settings for the lext (RHS of panel)

    JTextArea ta = new JTextArea();
    ta.setText(right);
    c.gridx = 1;
    c.gridy = nextGridY;
    c.gridwidth = 3;
    c.weightx = 1;
    mainPanel.add(ta, c);

    // Increase row number of next line
    nextGridY++;

}
Generated code etc...

据我所知,网格袋布局并不强制列的宽度相等。所以你得到的可能是第一列的宽度是50%,第二列和第三列的宽度是0或接近零,第四列的宽度也是50%


试着排一行,分别填充四列中的每一列。确保使用
weightx
选项。

据我所知,网格袋布局不会强制列的宽度相等。所以你得到的可能是第一列的宽度是50%,第二列和第三列的宽度是0或接近零,第四列的宽度也是50%


试着排一行,分别填充四列中的每一列。确保使用
weightx
选项。

给GridBagLayout一个关于单个单元格是什么的提示-只需为每个单元格添加一个空白区域作为第一行

gbc.gridx = 0;
gbc.gridwidth = 1;
for (int i=0; i<4; i++)
{  
  container.add(Box.createRigidArea(new Dimension()), gbc);
  gbc.gridx ++;
} 

//now add your rows
gbc.gridx = 0;
...
gbc.gridx=0;
gbc.gridwidth=1;

对于(int i=0;i给GridBagLayout一个关于单个单元格是什么的提示-只需为每个单元格添加一个空白区域作为第一行

gbc.gridx = 0;
gbc.gridwidth = 1;
for (int i=0; i<4; i++)
{  
  container.add(Box.createRigidArea(new Dimension()), gbc);
  gbc.gridx ++;
} 

//now add your rows
gbc.gridx = 0;
...
gbc.gridx=0;
gbc.gridwidth=1;

对于(int i=0;我可以为你想要实现的目标添加一个屏幕截图吗?你能为你想要实现的目标添加一个屏幕截图吗?这是一个有用的建议,要创建一个25-25-25-25行,它似乎会迫使其他行按照我想要的方式运行。我甚至可以在设计中添加这样一行,作为一种解决方法。我不知道虽然不是weightx的函数,但我认为它更多地与窗口调整大小时发生的情况有关。由于窗口中的四行宽度相等,因此更改值似乎没有任何效果。只要给所有行赋予相等的权重,就应该有助于使它们各占25%。这是一个有用的建议,似乎是将行设置为25-25-25-25强制其他行按我想要的方式运行。作为一种解决方法,我甚至可以在设计中加入这样一行。虽然我没有得到weightx的功能,但我认为它更多地与窗口调整大小时发生的情况有关。在四个等宽行中,更改值似乎没有任何效果。只要您愿意给他们所有人同等的重量,这应该有助于使他们每个25%。