在jpanel中居中jlabel

bis0qfac  于 2021-06-30  发布在  Java
关注(0)|答案(6)|浏览(691)

我有一个来自 JPanel . 我有一个来自 JLabel . 我正试图将这一习俗集中起来 JLabel 在我的面板上。
我知道的唯一可行的方法就是使用空布局( setLayout(null) )然后计算自定义的jlabel setLocation() 指向正确的位置。
习俗 JLabel 在这个应用程序中从一个面板移动到这个面板,我相信之前设置的位置 setLocation 正在影响事情。但是,当我把它设置为(0,0)时,组件会上升到左上角。 BorderLayout 不起作用,因为只有一个组件提供并放置到 BorderLayout.CENTER ,中心部分展开以填充所有空间。
我从另一个网站上剪切粘贴的一个例子 BoxLayout 以及 component.setAlignmentX(Component.CENTER_ALIGNMENT) . 这也没用。
另一个答复提到推翻小组的决定 getInset() 函数(我想这就是它的名字),但事实证明这是一个死胡同。
到目前为止,我正在和一个 GridBagLayout 布局和我包括一个 GridBagConstraints 当我插入自定义 JLabel 进入我的面板。不过,这是低效的。有没有更好的方法来集中注意力 JLabel 在我的 JPanel ?

disho6za

disho6za1#

忘记java标准库中的所有LayoutManager,使用miglayout。以我的经验来看,和一个能做你所期望的事情的人一起工作要容易得多。
下面是如何完成使用miglayout后的工作。

  1. import javax.swing.JFrame;
  2. import javax.swing.JLabel;
  3. import javax.swing.JPanel;
  4. import net.miginfocom.swing.MigLayout;
  5. public class Test
  6. {
  7. public static void main( String[] args )
  8. {
  9. JFrame frame = new JFrame( );
  10. JPanel panel = new JPanel( );
  11. // use MigLayout
  12. panel.setLayout( new MigLayout( ) );
  13. // add the panel to the frame
  14. frame.add( panel );
  15. // create the label
  16. JLabel label = new JLabel( "Text" );
  17. // give the label MigLayout constraints
  18. panel.add( label, "push, align center" );
  19. // show the frame
  20. frame.setSize( 400, 400 );
  21. frame.setVisible( true );
  22. }
  23. }

其中大部分只是样板。关键是布局约束: "push, align center" : align center 告诉miglayout将jlabel放置在其网格单元的中心。 push 告诉miglayout展开网格单元以填充可用空间。

展开查看全部
eeq64g8w

eeq64g8w2#

举起你的手 JLabel 被称为 label ,然后使用:

  1. label.setHorizontalAlignment(JLabel.CENTER);
thigvfpy

thigvfpy3#

用这个。

  1. labelName.setHorizontalAlignment(SwingConstants.CENTER);

  1. labelName.setHorizontalAlignment(JPanel.CENTER);

他们两个都必须工作。

8tntrjer

8tntrjer4#

为jpanel设置gridbaglayout,将没有任何gridbagconstraints的jlabel放在jpanel上,jlabel将居中

例子

  1. import java.awt.*;
  2. import javax.swing.*;
  3. public class CenteredJLabel {
  4. private JFrame frame = new JFrame("Test");
  5. private JPanel panel = new JPanel();
  6. private JLabel label = new JLabel("CenteredJLabel");
  7. public CenteredJLabel() {
  8. panel.setLayout(new GridBagLayout());
  9. panel.add(label);
  10. panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
  11. frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  12. frame.add(panel);
  13. frame.setSize(400, 300);
  14. frame.setLocationRelativeTo(null);
  15. frame.setVisible(true);
  16. }
  17. public static void main(String[] args) {
  18. EventQueue.invokeLater(new Runnable() {
  19. @Override
  20. public void run() {
  21. CenteredJLabel centeredJLabel = new CenteredJLabel();
  22. }
  23. });
  24. }
  25. }
展开查看全部
laximzn5

laximzn55#

boxlayout是一个不错的选择。如果设置x轴boxlayout,请尝试在组件前后添加水平胶水:

  1. panel.add(Box.createHorizontalGlue());
  2. panel.add(label);
  3. panel.add(Box.createHorizontalGlue());
zengzsys

zengzsys6#

我不喜欢这里的答案。
在我的职业生涯中,我从来没有见过gridbaglayout的有效使用。不是说没有,只是说我没有看到一个有效的,可能有关联。此外,将单个jlabel添加到 Container 可能会使它成为演示用途的中心,但是如果您尝试继续使用它而不是其他一些布局,那么您以后会有很多困难。
我确实喜欢关于boxlayout的建议,因为这实际上是一个很好的方法。也就是说,这个答案只是谜团的一部分,所以我要挖掘一个7年前的问题。

我的“答案”

你的问题真的没有简短的答案。根据你的提问,你的问题有一个确切的答案,但是stackoverflow是关于一个社区相互学习的,我怀疑你试图学习如何使用布局(或者你是7年前),并告诉你键入一个组合键来完成你的演示案例并不能教会你答案。
我将尽量不解释任何你不能自己在网上搜索答案的布局(最后有一个到oracle教程的链接,因为我认为它很好地解释了不同的布局)。

盒子布局

boxlayout是一种方法,上面已经有一个代码片段来演示它,所以我不提供。我要说的是,正如前面提到的,它只准确地回答了你的问题,但并没有真正教会你什么。glue,正如boxlayout所指,基本上给你一个相等数量的剩余房地产之间的所有'胶水'目前在市场上 Container . 所以,如果你要做

  1. panel.add(Box.createHorizontalGlue());
  2. panel.add(label);
  3. panel.add(Box.createHorizontalGlue());
  4. panel.add(otherLabel);

你会发现 JLabel 不再居中,因为“胶水”只剩下剩下剩下的不动产,两个之后 JLabels 已添加到 Container 这将在两个“插槽”(两个调用 Container#add(Component) with a glue parameter) in the 容器“”。

边框布局

边界布局是另一种方法。borderlayout分为5个区域。 BorderLayout#CENTER ,正如你可能猜到的,是中心区域。关于这个布局和它如何使事物居中的重要注意事项是它如何服从事物的大小 Component 在中间。但我不会详述;如果你有兴趣的话,我想最后的oracle教程会很好地介绍它。

值得注意的

我想你需要一个 GridLayout ,但这是一种更简单的方法 GridBagLayout ,我已经说过,即使我认为这不是一个好办法。所以我也不会详述这个。

关键是

尽管如此,我认为所有的布局经理都值得一看。就像任何与编程有关的东西一样,使用适合工作的工具。不要因为你以前使用过x布局就认为你应该一直使用x布局而没有其他可行的布局。找出您希望显示的外观,以及您认为它在调整组件大小方面的表现,然后选择您认为最适合的。
选择正确工具的另一个双重含义是,您不必只将所有组件装配到一个单独的工具中 Container 做一个布局做所有的事情。没有什么能阻止你(我强烈建议你)使用多个 Containers 把他们都聚在一起。控制每个 Container 具有适合于该显示部分的布局,以及适用于不同区域的不同布局 Container .

重要!!

这一点之所以非常重要,是因为每个布局都有其遵循的规则和内容,以及它们尊重的其他内容,而其他内容则被有效忽略(例如,首选、最大和最小尺寸)。如果您[正确地]使用不同的布局,您会发现您的显示器接受动态调整大小,同时仍然遵循您希望它保持的形状。这是一个非常重要的关键区别,做正确的方式,只是解决问题 GridBagLayout .

  1. JPanel outer = new JPanel(new BorderLayout());
  2. JPanel centerPanel = new JPanel();
  3. centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS));
  4. JPanel southPanel = new JPanel(new CardLayout());
  5. outer.add(centerPanel, BorderLayout.CENTER);
  6. outer.add(southPanel, BorderLayout.SOUTH);

找出适合您的场景的内容,然后继续。没有一刀切的方法,除非你想要一些过于繁琐的东西,并且被其他的布局(例如gridbaglayout)弄得多余。

甲骨文教程

如果你已经做到了这一点,那么我认为你正在寻找尽可能多的信息。在这种情况下,我强烈建议您阅读oracle关于布局管理器的教程,因为它很好地列出了所有布局管理器的一般细节:https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

展开查看全部

相关问题