Java 将组件设置在页面的中心

Java 将组件设置在页面的中心,java,swing,flowlayout,Java,Swing,Flowlayout,如何在面板中央设置组件(比如按钮)? 我使用了布局约束为中心的Flowlayout,但我在面板的顶部中心位置获得了按钮。使用gridbagloayout而不是Flowlayout JPanel panel=new JPanel(); panel.setLayout(new GridBagLayout()); panel.add(new JButton("Sample")); // will use default value of GridBagConstraints 使用null布局并设置按

如何在面板中央设置组件(比如按钮)?


我使用了布局约束为中心的
Flowlayout
,但我在面板的顶部中心位置获得了按钮。

使用
gridbagloayout
而不是Flowlayout

JPanel panel=new JPanel();
panel.setLayout(new GridBagLayout());
panel.add(new JButton("Sample")); // will use default value of GridBagConstraints

使用
null
布局并设置按钮的边界,如下所示:

// assuming you're extending JPanel
private JButton button; // data field

...

this.setLayout(null);
this.addComponentListener(new ComponentAdapter(){
   public void componentResized(ComponentEvent e){
       setButtonBounds();
   }
});

private void setButtonBounds(){
   int bw = 90; // button width
   int bh = 30; // button height
   int w = getWidth();
   int h = getHeight();
   button.setBounds((w - bw) / 2, (h - bh) / 2, bw, bh);
}

如果你开始有很多按钮或者复杂的布局,考虑使用.< /P> < P>这可以用1或。有关示例代码,请参见

就我个人而言,我会使用GBL来实现这一点,因为在屏幕上(以父容器为中心)布局组件所需的代码行更少

  • 我不明白为什么这个答案不是为了获得更多的选票,但除此之外

  • 前两行可以写成一行+1(我为数不多的几件事之一)-1表示甚至建议
    null
    布局。编辑掉它&我将删除否决票(但我不会放弃对
    miglaway
    ,当有2个J2SE布局可以做所需的事情时)。我从未真正理解
    null
    布局为何如此糟糕,但足够公平。我会留下我的答案并接受-1。请参阅我对这个主题的评论(一些不友善的人可能会称之为“咆哮”)。当然,但为什么不将该逻辑封装到布局中(在布局中,不需要调用
    setLayout(null)
    ?即使是上面的示例也可以(既可以改进,也可以改进)更好地封装在布局中。在您需要第二个(第三个..17个)的“中心组件”实例之前,在代码中内联这样做似乎是有意义的,这是一个非常基本的要求。顺便说一句,关于它可以“改进”的评论。当存在
    getPreferredSize()
    (考虑当前按钮文本、边框、PLAF等)?几乎是一个经典的例子,例如我的观点!+1,因为它有很好的意义,我确实同意你的观点。取消布局并手动设置边界似乎是多余的。我认为这归结为缺乏对核心布局管理器实际如何工作的理解。因此我同意管理器/封装更好,但它们仍然会两者兼而有之如果答案是正确的,我不会——因为有人建议了一个合适的(也许是愚蠢的)答案使用
    null
    布局。再说一次,我认为这里不是讨论的地方,所以我将在这里结束。不过,谢谢。+1对于这个和这个-@AVD,这是我最喜欢的答案之一。特别是因为垃圾神提供了漂亮的屏幕截图(我经常借用它们来说明其他线程中的要点).真的很完美。:)