并排放置按钮
如何将按钮放在一起并排放置。我使用了gridBagLayout来设计布局。问题在于按钮距离彼此太远。我试图选择CENTER作为锚点,但这会使按钮重叠。如果我使用WEST和EAST,则按钮位置彼此相距太远。并排放置按钮
例如保存----------新模式,而不是保存NEW_PATTERN。
JButton bSave = new JButton("SAVE");
JButton bPattern = new JButton("NEW_PATTERN");
con = new GridBagConstraints();
con.anchor=GridBagConstraints.WEST;
con.gridy = 3; con.gridx = 0;
con.gridwidth = 1; con.gridheight = 1;
con.insets= new Insets(2,5,2,2);
m.setConstraints(bSave, con);
c.add(bSave);
con.weightx=1;
con.gridy=3; con.gridx=0;
con.anchor=GridBagConstraints.EAST;
m.setConstraints(bPattern,con);
c.add(bPattern);
感谢AKF,我已经放置的FlowLayout的GridBagLayout的内部解决了这个问题。
....
JButton bSave = new JButton("Save");
JButton bPattern = new JButton("New Pattern");
JPanel pContainer = new JPanel();
pContainer.setLayout(new FlowLayout(FlowLayout.CENTER));
pContainer.add(bSave); pContainer.add(bPattern);
con = new GridBagConstraints();
con.anchor=GridBagConstraints.CENTER;
con.gridy = 3; con.gridx = 0;
con.gridwidth = 1; con.gridheight = 1;
m.setConstraints(pContainer, con);
c.add(pContainer);
....
GridBagLayout是最复杂的布局。如果你只是对齐几个按钮,我会推荐使用FlowLayout(默认)或BoxLayout。但是,如果您想要使用GridBagLayout,而不是调整锚点,请将gridx调整为第二个按钮的值为1。此外,不知道为什么你有一个gridy 3而不是gridy 0(除非有其他代码,你已经省略,使用gridy 0-2)。
为什么不在发布新问题之前先阅读旧帖子?
你在哪里给了你上一篇文章中Swing教程的链接。因此,阅读教程,试用这些示例,并使用适当的布局管理器或布局管理器组合来完成这项工作。
而不是GridBagLayout
,GridLayout
是一个简单的解决方案。这是很容易设置:
JButton bSave = new JButton("SAVE");
JButton bPattern = new JButton("NEW_PATTERN");
JPanel panel = new JPanel(new GridLayout(1,2); // 1 row, 2 cols
panel.add(bSave);
panel.add(bPattern);
编辑:
只是出于好奇,我与你原来的打打闹闹,发现一个组合允许仅使用的GridBagLayout的。它是不是比你原来很大的不同:
GridBagConstraints con = new GridBagConstraints();
con.anchor=GridBagConstraints.WEST;
con.gridy = 3;
con.gridx = 0;
con.gridwidth = 1;
con.gridheight = 1;
con.insets= new Insets(2,5,2,2);
m.setConstraints(bSave, con);
c.add(bSave);
con.weightx=0;
con.gridy=3;
con.gridx=1;//this is the big diff!
con.anchor=GridBagConstraints.EAST;
m.setConstraints(bPattern,con);
c.add(bPattern);
我建议你阅读GridBagLayout的教程,因为它是开箱即用的最先进的布局管理器,并且使其它过时的过时。出于这些原因,这非常值得学习。如果你把它想象成一个网格,并且你必须得到的所有东西都是x和y坐标,这就是你在代码中遗漏的东西,它使得一切都变得简单。你几乎在那里:)
混合布局管理器通常是一个非常糟糕的主意,因为它们在填充具有额外空间的容器时都略有不同。
@camickr 基于我的评论,人们应该使用GridBagLayout,因为它是最灵活的一个,可以在任何情况下使用。只有一个应该导致简单和可维护的可能。我也发现它很容易阅读,因为它是逻辑映射的。只有当你为所有组件使用一个约束对象时,约束才会改变,这显然是一个坏主意。
编写最简单,最易维护的代码应该是目标。这意味着使用适当的布局管理器来完成这项工作。这并不意味着强制每个布局使用相同的布局管理器。 GridBagLayout最初是由IDE使用的,因为IDE的智能性不足以将GUI分解成更小的逻辑分组,导致复杂的非可维护代码,其中更改一个约束会影响其余约束。根据你的建议,每个人都应该使用GroupLayout,因为它是IDE的最新专业布局,结果只是一个很难读,不可维护的代码。 – camickr 2009-10-08 15:24:52
此代码将按钮并排放置在屏幕中央。
重点是:
constraints.fill = GridBagConstraints.NONE; - >使butons不扩大
constraints.insets。右= 0; - >使得按钮并排站
constraints.insets.left = 0; - >使得按钮并排站
constraints.weightx = 1 - >使得在至极按钮细胞水平EXPANDO
constraints.anchor = GridBagConstraints.EAST; - >使得左键站在小区的
constraints.anchor = GridBagConstraints.WEST; - >品牌站在单元格左侧的右键
public static void main(String args[]){
JFrame frame=new JFrame();
Container cont=frame.getContentPane();
cont.setLayout(new GridBagLayout());
GridBagConstraints constraints=new GridBagConstraints();
constraints.insets.top=2;
constraints.insets.bottom=2;
constraints.insets.left=0;// increment to separate buttons
constraints.insets.right=0;// increment to separate buttons
constraints.fill=GridBagConstraints.NONE;
constraints.weightx=1;
constraints.gridy=0;
constraints.anchor=GridBagConstraints.EAST;
constraints.gridx=0;
cont.add(new JButton("Save"),constraints);
constraints.anchor=GridBagConstraints.WEST;
constraints.gridx=1;
cont.add(new JButton("New Pattern"),constraints);
frame.pack();
frame.setVisible(true);
}
是否有可能同时具有gridBagLayout和flowLayout? – Jessy 2009-10-08 02:08:02
是和否:)一个'Container'只能有一个'LayoutManager'。但是,在GridBagLayout中,您可以添加'JPanels',这些'JPanel''可以使用他们自己的'LayoutManager',因此您可以在其中一个面板中使用'FlowLayout'。 – akf 2009-10-08 02:28:16
谢谢akf,我已经用你的代码解决了这个问题:-) ... – Jessy 2009-10-08 02:35:15