我读了一些问题,说明GBL优于普通的GridLayout来定位组件。
链接: first,second,Oracle 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();
}
});
}
}
但我希望它们出现在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);
这是我的问题,我设置两个按钮的首选大小相同,但它仍然没有正确显示第二个。 (makeGbc的x,y之后的4个数字是顶部,左侧,底部,右侧的Insets值)
答案 0 :(得分:3)
您的按钮位于中间,而不是顶部,因为您将按钮放在那里:
gbc.anchor = (x == 0) ? GridBagConstraints.LINE_START : GridBagConstraints.LINE_END;
GridBagConstraints.LINE_END
和GridBagConstraints.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()
。