2012-03-22 91 views
10

居中的JLabel我已经从JPanel衍生的面板。我有一个来自JLabel的自定义控件。我试图在我的面板上将此自定义JLabel居中。在一个JPanel

我知道这样做的唯一方法就是使用空布局(setLayout(null)),然后计算自定义JLabel的setLocation()点,以便它在正确的位置。

定制JLabel物理从一个面板移动到该面板在这个应用程序,我相信位置以前在setLocation设置是影响的事情。但是,当我将它设置为(0,0)时,组件会进入左上角。

BorderLayout不起作用,因为当只提供1个组件并放置到BorderLayout.CENTER时,中央部分扩大以填充所有空间。

我切割并从另一个网站粘贴一个例子使用BoxLayoutcomponent.setAlignmentX(Component.CENTER_ALIGNMENT)。这也没有用。

提到覆盖面板的getInset()函数的另一个答案(我认为这就是所谓的),但是这被证明是一个死胡同。

到目前为止,我正在使用一个带有GridBagLayout布局的面板,当我将自定义JLabel插入我的面板时,我会包含一个GridBagConstraints对象。虽然这效率很低。有没有更好的方式来中心在我JPanelJLabel

+8

考虑开采的实际问题了咆哮。 – 2012-03-22 19:47:52

+0

哦,以后我使用的GridBagLayout与GridBagConstraints的方法事情看起来OK,如果我最小化,然后恢复主窗口。 – Shackleford 2012-03-22 19:55:00

+2

写这整个咆哮的时间足以使输入到谷歌“摇摆与布局管理工作”,点击官方摆动教程的第一击,看视觉引导,决定BoxLayout的看起来很有希望,看到它做更多的例子以下你想要什么(它包含两个组件ISO单一个) – Robin 2012-03-22 22:01:34

回答

8

BoxLayout的是要走的路。如果你设置了一个X_AXIS的BoxLayout,尝试组件前后分别增加水平胶水:

panel.add(Box.createHorizontalGlue()); 
panel.add(label); 
panel.add(Box.createHorizontalGlue()); 
7

忘记了Java标准库中的所有布局管理和使用MigLayout。根据我的经验,与通常一起工作会更容易,完全符合您的期望。

下面是如何完成使用MigLayout后的结果。

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

import net.miginfocom.swing.MigLayout; 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     JFrame frame = new JFrame(); 
     JPanel panel = new JPanel(); 

     // use MigLayout 
     panel.setLayout(new MigLayout()); 

     // add the panel to the frame 
     frame.add(panel); 

     // create the label 
     JLabel label = new JLabel("Text"); 

     // give the label MigLayout constraints 
     panel.add(label, "push, align center"); 

     // show the frame 
     frame.setSize(400, 400); 
     frame.setVisible(true); 
    } 
} 

大部分只是样板。关键是布局约束:"push, align center"

align center告诉MigLayout将JLabel放置在其网格单元的中心。

push告诉MigLayout展开网格单元以填充可用空间。

+0

有一个很好的MigLayout备忘单可以在:http://migcalendar.com/miglayout/mavensite/docs/cheatsheet.html – ulmangt 2012-03-22 20:08:09

+0

您可以从这里下载最新版本的MigLayout:http://www.migcalendar.com/miglayout /versions/4.0/miglayout-4.0-swing.jar – ulmangt 2012-03-22 20:09:49

+0

有趣!感谢您的提示,我将不得不为未来记住这一点,但现在我希望保留在Java库中。我仍然很新,想要学习。 – Shackleford 2012-03-23 07:36:50

23

套装GridBagLayoutJPanel,把JLabel没有任何GridBagConstraintsJPanelJLabel将居中

enter image description here

例如

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

public class CenteredJLabel { 

    private JFrame frame = new JFrame("Test"); 
    private JPanel panel = new JPanel(); 
    private JLabel label = new JLabel("CenteredJLabel"); 

    public CenteredJLabel() { 
     panel.setLayout(new GridBagLayout()); 
     panel.add(label); 
     panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.add(panel); 
     frame.setSize(400, 300); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       CenteredJLabel centeredJLabel = new CenteredJLabel(); 
      } 
     }); 
    } 
} 
+0

谢谢mKorbel,不仅发布有用的信息,但如此彻底做。不幸的是,这使我陷入了同样的情况,我出现了意外的行为(放置我的JLabel后我的面板中没有出现任何内容)。当我将你的例子塞进我的实际代码中并使用一个虚拟的JButton时,JButton的位置是完美的。我甚至给JButton添加了一些设置来模仿我的自定义JLabel,它仍然有效,但是当我使用我的JLabel时?那是事情不起作用的时候。我不明白。有一些东西阻止我的JLabel做这些虚拟JButton做的事情。 – Shackleford 2012-03-23 07:28:33

13

Supose您JLabel被称为label,然后使用:

label.setHorizontalAlignment(JLabel.CENTER); 
+0

这绝对是一个旧的帖子,但当重新审视Swing的新项目时,这绝对是最简单的答案。为什么这不是标记的答案超出了我。 – Maxs728 2016-07-18 15:25:21

+0

这是错误的。它影响标签内容的位置,而不是标签在容器内的位置。 – Kroky 2018-01-23 21:49:24