2011-08-24 153 views
13

我正在使用NetBeans GUI生成器来处理我的布局(我对LayoutManager非常糟糕),并试图放置一个简单的JLabel,以便它始终在其父级JPanel中居中(水平) 。理想情况下,即使JPanel被调整大小,这也会保持真实,但如果这是一个疯狂的编码量,而不是仅仅在JPanel第一次创建时居中就足够了。在JPanel上居中定位JLabel

我自己试图处理布局已经够糟糕了,但是由于NetBeans GUI Builder自动生成不可变的代码,因此我无法弄清楚如何执行此对中操作,并且我一直无法在网上找到任何内容帮我。

感谢任何能引导我走向正确方向的人!

回答

11

通过使用Borderlayout,您可以将任何JComponents添加到CENTER区域。有关示例,请参见an answer to Stack Overflow question Get rid of the gap between JPanels。这应该工作。

+0

感谢您的回复,但是NetBeans GUI Build使用GroupLayout,并且这是不可覆盖的。请记住,我不只是在试图与Swing及其威胁性的LayoutManagers进行抗争,我正在与专门为GroupLayout自动生成代码的GUI生成器战斗! – IAmYourFaja

+0

+1:BorderLayout是正确的。 – Heisenbug

+0

@Mara:我真的建议你开始学习如何使用布局管理器。这并不困难。相反,使用gui builder很难获得相同的结果。 – Heisenbug

10

即使BoxLayout的,你可以做到这一点:

JPanel listPane = new JPanel(); 
listPane.setLayout(new BoxLayout(listPane, BoxLayout.X_AXIS)); 

JLabel label = new JLabel(); 
listPane.add(Box.createHorizontalGlue()); 
listPane.add(label); 
listPane.add(Box.createHorizontalGlue()); 

mKorbel的解决方案非常适合你的目标。无论如何,我总是喜欢推荐BoxLayout,因为它非常灵活。

+0

谢谢Overbose,但我坚持GroupLayout。如果我花更多的时间在客户端,我一定会接受你的建议并从头开始学习LayoutManagers。我只是在寻找一个快速和肮脏的解决方案。这使用GroupLayout。 – IAmYourFaja

+2

*“我被GroupLayout卡住了”*仅仅因为你不知道如何使用Netbeans。我没有使用它,但我看到了使用所有标准布局的Netbeans用户(即使使用GUI设计器)的代码。 –

26

这里有四种方式来中心中的部件:

4 Centered Components

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

class CenterComponent { 

    public static JLabel getLabel(String text) { 
     return getLabel(text, SwingConstants.LEFT); 
    } 

    public static JLabel getLabel(String text, int alignment) { 
     JLabel l = new JLabel(text, alignment); 
     l.setBorder(new LineBorder(Color.RED, 2)); 
     return l; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       JPanel p = new JPanel(new GridLayout(2,2,4,4)); 
       p.setBackground(Color.black); 
       p.setBorder(new EmptyBorder(4,4,4,4)); 

       JPanel border = new JPanel(new BorderLayout()); 
       border.add(getLabel(
        "Border", SwingConstants.CENTER), BorderLayout.CENTER); 
       p.add(border); 

       JPanel gridbag = new JPanel(new GridBagLayout()); 
       gridbag.add(getLabel("GridBag")); 
       p.add(gridbag); 

       JPanel grid = new JPanel(new GridLayout()); 
       grid.add(getLabel("Grid", SwingConstants.CENTER)); 
       p.add(grid); 

       // from @0verbose 
       JPanel box = new JPanel(); 
       box.setLayout(new BoxLayout(box, BoxLayout.X_AXIS)); 

       box.add(Box.createHorizontalGlue()); 
       box.add(getLabel("Box")); 
       box.add(Box.createHorizontalGlue()); 
       p.add(box); 

       JFrame f = new JFrame("Streeeetch me.."); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       f.setContentPane(p); 
       f.pack(); 
       f.setLocationByPlatform(true); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 
+2

更新后+1 – mKorbel

6

玛拉: “您的答复,谢谢,但在NetBeans GUI构建使用的GroupLayout,这是不可重写。”

不正确!右键单击NetBeans GUI构建器中的JFrame(或任何其他GUI容器)内的任意位置,然后选择“设置布局”。默认情况下,选择“免费设计”,这是组织布局,但您可以选择任何其他布局,包括mKo​​rbel建议的边框布局。