并排放置按钮

问题描述:

如何将按钮放在一起并排放置。我使用了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); 
+0

是否有可能同时具有gridBagLayout和flowLayout? – Jessy 2009-10-08 02:08:02

+0

是和否:)一个'Container'只能有一个'LayoutManager'。但是,在GridBagLayout中,您可以添加'JPanels',这些'JPanel''可以使用他们自己的'LayoutManager',因此您可以在其中一个面板中使用'FlowLayout'。 – akf 2009-10-08 02:28:16

+0

谢谢akf,我已经用你的代码解决了这个问题:-) ... – Jessy 2009-10-08 02:35:15

我建议你阅读GridBagLayout的教程,因为它是开箱即用的最先进的布局管理器,并且使其它过时的过时。出于这些原因,这非常值得学习。如果你把它想象成一个网格,并且你必须得到的所有东西都是x和y坐标,这就是你在代码中遗漏的东西,它使得一切都变得简单。你几乎在那里:)

混合布局管理器通常是一个非常糟糕的主意,因为它们在填充具有额外空间的容器时都略有不同。

@camickr 基于我的评论,人们应该使用GridBagLayout,因为它是最灵活的一个,可以在任何情况下使用。只有一个应该导致简单和可维护的可能。我也发现它很容易阅读,因为它是逻辑映射的。只有当你为所有组件使用一个约束对象时,约束才会改变,这显然是一个坏主意。

+0

编写最简单,最易维护的代码应该是目标。这意味着使用适当的布局管理器来完成这项工作。这并不意味着强制每个布局使用相同的布局管理器。 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); 
    }