GridBagLayout:设置组件的位置

时间:2015-06-06 11:11:50

标签: java swing user-interface layout-manager gridbaglayout

我读了一些问题,说明GBL优于普通的GridLayout来定位组件。

链接: firstsecondOracle Tutorial

那么我试着在我的GBL中添加一些组件(按钮)但它总是以我的组件为中心。分离2个按钮的唯一方法是将Dummies放入我看起来很糟糕的项目中。

public class GridGUI extends JPanel {

private JButton button;

public GridGUI() {
    setLayout(new GridBagLayout());
    GridBagConstraints comps = makeGbc(0,1);
    JPanel panel = new JPanel();
    button = new JButton("Datei speichern");
    button.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            // TODO Auto-generated method stub

        }

    });
    panel.add(button);
    add(panel,comps);

    comps = makeGbc(1,1);
    button = new JButton("Datei laden");
    panel.add(new JPanel());
    panel.add(new JPanel());
    panel.add(new JPanel());
    panel.add(new JPanel());
    panel.add(new JPanel());
    panel.add(new JPanel());
    panel.add(new JPanel());
    panel.add(new JPanel());
    panel.add(new JPanel());
    panel.add(new JPanel());
    panel.add(new JPanel());
    panel.add(button);
    add(panel,comps);
}

private GridBagConstraints makeGbc(int x, int y) {
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    gbc.gridx = x;
    gbc.gridy = y;
    gbc.weightx = x;
    gbc.weighty = 1.0;
    gbc.insets = new Insets(5, 5, 5, 5);
    gbc.anchor = (x == 0) ? GridBagConstraints.LINE_START : GridBagConstraints.LINE_END;
    gbc.fill = GridBagConstraints.HORIZONTAL;
    return gbc;
}

public static void showGUI() {
    JFrame frame = new JFrame("Pop-Art-Collage");
    frame.getContentPane().add(new GridGUI());
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setSize(800, 800);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {

        @Override
        public void run() {
            showGUI();
        }

    });
}

}

The GUI

但我希望它们出现在GUI的顶部而不是中心。

此外,我尝试使用button.setSize(x,y)调整按钮的大小,但它们始终保持不变。

提前致谢

编辑:

好的,我现在尝试了解决方案,但我遇到了其他一些问题。

    GridBagConstraints comps = makeGbc(0,1,20,50,0,0);
    button = new JButton("Datei speichern");
    button.setPreferredSize(new Dimension(200,25));
    add(button,comps);
    JButton button2 = new JButton("Datei laden");
    button2.setPreferredSize(new Dimension(100,25));
    comps = makeGbc(1,1,20,150,0,100);
    add(button2,comps);

new

这是我的问题,我设置两个按钮的首选大小相同,但它仍然没有正确显示第二个。 (makeGbc的x,y之后的4个数字是顶部,左侧,底部,右侧的Insets值)

1 个答案:

答案 0 :(得分:3)

您的按钮位于中间,而不是顶部,因为您将按钮放在那里:

gbc.anchor = (x == 0) ? GridBagConstraints.LINE_START : GridBagConstraints.LINE_END;

GridBagConstraints.LINE_ENDGridBagConstraints.LINE_START将组件放入中心位置。试试:

gbc.anchor = (x == 0) ? GridBagConstraints.FIRST_LINE_START : GridBagConstraints.FIRST_LINE_END;

另外:

  • 尝试使用setPreferredSize()设置按钮的大小,使用frame.pack()的GBL应该尊重选择的尺寸,

  • 您将按钮添加到新JPanels,然后添加到带有GBL的容器,因此它将按钮置于中心位置。将您的按钮直接添加到GridGUI,它将根据GridBagConstraints()进行放置,例如:

    button = new JButton("Datei laden");
    add(button,makeGbc(1,1));
    
  • 您使用一个类字段JButton button,对于两个不同的按钮,这样您更改按钮引用后无法更改第一个按钮状态 - 如果您尝试更改按钮中的示例文本,从应用程序的不同部分,使用button类字段,您只能访问第二个按钮。

修改

我不确定您确切想要什么效果,但我会先尝试将您的GridGUI添加到新的JPanel,然后再添加到JFrame(在主方法中):

JFrame frame = new JFrame("Pop-Art-Collage");
JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); //add FlowLayout.LEFT,
panel.add(new GridGUI());
frame.getContentPane().add(panel);

现在,FlowLayout应该保留所有组件,并且您可以通过更改insets来控制按钮之间的空间。对于第一个按钮,a将所有输入设置为0,而在第二个按钮中设置new Insets(0,x,0,0),其中x是所需距离。像这样:

add(button,makeGbc(0,1,0,0,0,0));
add(button2,makeGbc(0,1,0,150,0,0));

但我不确定,当您添加更多组件时,这组布局将如何表现,因此更简单的方法是仅使用frame.pack(),而不使用frame.setSize(),然后通过添加来扩展它新组件。然后,应该更容易预测变更将如何运作。

还要注意一个事实,即在上面的示例代码中,您为两个按钮设置了不同的setPreferredSize()