2010-11-09 88 views
3

垂直对齐我想要做的是将一个GridBagLayout面板放在我的BorderLayout的中心,并垂直对齐GridBagLayout面板(/和它上面的文本)到TOP(因为它自动地把它放在中间,水平和垂直)。GridBagLayout面板在BorderLayout.CENTER

所以我basicly尝试(但最终在中间x和顶部Ÿ在总页面中具有GridBagLayout的文本仍然代替):

import java.awt.*; 
import java.applet.*; 
import javax.swing.*; 
import javax.imageio.*; 
import javax.swing.BorderFactory; 
import javax.swing.border.*; 
import java.awt.event.*; 

public class Test extends JApplet implements MouseListener, ActionListener { 

public void init() { 
    //create borderlayout 
    this.setLayout(new BorderLayout()); 
    //create a GridBagLayout panel 
    JPanel gb = new JPanel(new GridBagLayout()); 
    JLabel content = new JLabel("Some text"); 
    //set GridBagConstraints (gridx,gridy,fill,anchor) 
    setGBC(0, 0, GridBagConstraints.VERTICAL, GridBagConstraints.NORTH); 
    gb.add(content, gbc); //gbc is containing the GridBagConstraints 
    this.add(gb, BorderLayout.CENTER); 
    } 

} 

所以我试图用gridbagconstraints锚点将对齐方式设置为垂直于北部,顶部,但似乎不起作用。我也尝试调整GridBagLayout面板本身的大小(使其具有完全的布局高度,100%,使用panel.setSize和setPreferredSize),然后使用gridbagconstraints.anchor垂直对齐它上的元素,但那不起作用无论是。

任何人都可以帮我解决这个问题吗?

由于提前,

最好的问候, Skyfe。

所以我的问题是

+0

您的SSCCE在哪里? – camickr 2010-11-09 16:37:00

+0

我仍然不明白为什么这不是一个SSCCE(http://pscode.org/sscce.html)它很短,我只显示涉及问题的代码,这是正确的,我说明了问题给出的代码对我来说看起来像是一个“SSCCE” – Skyfe 2010-11-09 18:37:30

+0

如果它需要能够复制粘贴,只需将它复制粘贴到基本applet代码的init方法或普通java应用程序的主要方法中码。 – Skyfe 2010-11-09 18:39:29

回答

12

在使用它之前,请仔细阅读GridBagConstraints类的每个属性的Javadoc。

import java.awt.*; 
import javax.swing.*; 

public class Test extends JFrame { 

    public static void main(String arg[]) { 
    JFrame frame = new JFrame(); 
    frame.setLayout(new BorderLayout()); 

    JPanel gb = new JPanel(new GridBagLayout()); 
    JLabel content = new JLabel("Some text"); 

    GridBagConstraints gbc = new GridBagConstraints(); 
    gbc.anchor = GridBagConstraints.NORTH; 
    gbc.weighty = 1; 

    gb.add(content, gbc); // gbc is containing the GridBagConstraints 
    frame.add(gb, BorderLayout.CENTER); 

    frame.setVisible(true); 
    } 

} 
+0

谢谢,我明白了,你所提供的代码非常棒!它只适用于当我设置fill = GridBagConstraints.NONE而不是VERTICAL时,这是什么原因? – Skyfe 2010-11-10 07:51:02

+0

设置gbc.fill = GridBagConstraints.VERTICAL时,布局调整JLabel的大小以填充所有可用的垂直空间。默认情况下,JLabel的字符集中在其空间中。所以,你需要做的是:JLabel.setVerticalAlignment(SwingConstants.TOP); – Montecarlo 2010-11-10 21:22:00

+0

我认为在这个例子中扩展JFrame是不必要的。 – fachexot 2013-02-17 13:53:08

1

setGBC(0, 0, GridBagConstraints.VERTICAL, GridBagConstraints.NORTH); 

正在GB垂直填充成分( “内容”)。这可能就是为什么你认为你的组件(内容)仍然处于中间位置。尝试将其设置为GridBagConstraints.NONE。 这将使您的内容与具有GridBagLayout的面板中的顶部对齐。

的外部组件,你可以随时使用类似:

panel.add(button, BorderLayout.PAGE_START); 

,看看它是否工作。

+0

感谢您的回应,所以如果我理解正确,它将垂直填充GridBagLayout面板,并将其内部的组件向北方排列,但将GridBagLayout面板本身仍置于borderlayout的中间(x和y方向)。没有办法在BorderLayout.CENTER位置垂直对齐GridBagLayout面板吗?或者使它完全垂直填充BorderLayout.CENTER? (GridBagConstraints.NONE导致空白,空btw) – Skyfe 2010-11-09 16:21:30

+0

我编辑我的回复更加精确。 – 2010-11-09 22:45:48

0

除了将fill设置为无,还将weighty设置为非0值(例如1.0)。这告诉布局将GridBag列中的所有额外空间分配给该特定单元格,但由于标签本身锚定在北部并设置为未填充,因此额外空间将分配在标签下方。

+0

感谢您的解释!我明白这些属性现在所做的更好 – Skyfe 2010-11-10 07:52:25