【问题标题】:Make a JLabel text vertically aligned to the center使 JLabel 文本与中心垂直对齐
【发布时间】:2020-06-25 05:34:22
【问题描述】:

如何使JLabel 文本垂直和水平对齐到中心?

我必须使用setHorizontalTextPositionsetVerticalTextPosition。这可以通过使用这两个来实现吗?

我已经尝试过,但文字仍然在顶部。

 import java.awt.FlowLayout;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.SwingConstants;

public class label extends JFrame
{
  private JLabel label;

    public label() //constructor
    {
      super("Simple GUI");
      setLayout(new FlowLayout());

      label=new JLabel("Centered JLabel");
      label.setHorizontalTextPosition(SwingConstants.CENTER);
      label.setVerticalTextPosition(SwingConstants.CENTER);
      add(label);
    }
 }

【问题讨论】:

  • 1) 为了尽快获得更好的帮助,edit 添加minimal reproducible exampleShort, Self Contained, Correct Example。该代码只需要main 方法即可使其成为 MRE / SSCCE。 2) 将标签作为唯一没有约束的组件放入GridBagLayout - 它将水平和垂直居中。
  • .. 3) 请学习常见的 Java 命名法(命名约定 - 例如EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttribute,除非它是 UPPER_CASE_CONSTANT)并始终如一地使用它。
  • .. 4) 始终阅读被调用方法的文档。 setHorizontalTextPosition 并没有像您认为的那样做。这里需要的方法包括术语Alignment。 5) 在调试布局或对齐问题时为组件添加可见边框(例如LineBorder)。它可以揭示一些令人惊讶的结果。

标签: java swing alignment jlabel layout-manager


【解决方案1】:

我已经尝试过,但文字仍然在顶部。

你有两个问题:

  1. Andrew 解决了第一个问题。您使用了错误的方法。
  2. 接下来您使用了错误的布局。 FlowLayout 仅在一行上显示组件,因此组件将始终位于顶部。不要更改布局管理器。 JFrame 的默认布局管理器是BorderLayout。当您将组件添加到CENTER(这是您未指定约束时的默认设置)时,组件将调整大小以填充整个框架。然后“对齐”属性将控制文本在分配给标签的大小内的位置。

或者不同的选择是使用GridBagLayout。那么你就不需要玩组件的对齐选项了:

setLayout( new GridBagLayout() );
add(label, new GridBagConstraints());

尝试这两个选项,因为它们可能在不同情况下都有效。

阅读 Layout Managers 上的 Swing 教程,以更好地了解每个布局管理器的工作原理。

【讨论】:

    【解决方案2】:

    非常抱歉不知道为什么 setHorizo​​ntalTextPosition 方法和 setVerticalTextPosition 方法不起作用。

    但是,我会让你知道,有几种方法可以通过在创建标签时插入参数与字符串对齐来对标签中的文本进行排序。

    首先,camickr 的答案是最好的答案,因为 Swing 被设计为与布局管理器一起使用!!

    请记住,最推荐的方法是通过camickr将GridBagLayout()应用到JFrame的Layout上。

    此答案旨在通知您 这种方法也可以,但一般情况下不推荐

    不建议使用此方法,因为会更改框架的大小 将组件保持在适当的位置,但它可以为您提供一些帮助 当表明组件的尺寸和位置时 容器的使用方式可以在特殊情况下使用,例如 当它们需要在没有外部影响的情况下进行修复时。

    为了更好地了解问题,我将简单地更改您上传给我的代码,以便它可以执行。

    import java.awt.FlowLayout;
    
     import javax.swing.JFrame;
     import javax.swing.JLabel;
     import javax.swing.SwingConstants;
    
     import java.awt.Color;
    
    public class StackOver extends JFrame
    {
      private JLabel label;
    
        public StackOver() //constructor
        {
          super("Simple GUI");
          setLayout(null);
          setSize(500,300);     
    
          label=new JLabel("Centered JLabel", JLabel.CENTER); 
    
    
          /*
          label.setHorizontalTextPosition(SwingConstants.CENTER);
          label.setVerticalTextPosition(SwingConstants.CENTER);*/
    
          add(label);
          setDefaultCloseOperation(EXIT_ON_CLOSE);
          setVisible(true);
        }
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            new StackOver();
        }
     }
    

    嗯,让我们在 JLabel 的背景中添加一些颜色以了解更多信息。

    label.setOpaque(true);            //Transparency Settings
    label.setBackground(Color.pink);      //Specify background color
    //to use 'Color' class, We must import java.awt.Color;
    

    JFrame 设置被设置为FlowLayout()这使得组件的位置和大小是固定的,所以我们看不到它工作!

    所以现在我们将完成接下来的两个过程。 1)将JFrame的布局改为null以使用Absolute Layout(“不推荐,只是一个案例”) 2) 更改 JLabel 的大小和位置 在进度之后我们可以看到文本对齐工作!

    1) 更改 JFrame 的布局

    following link: Layout Manager 表明 FlowLayout 之外还有很多布局。

    Swing 被设计为使用布局管理器,因此您当然应该使用上面的 Layout 链接之一。

    但是,要使用一种有趣的方式来绝对固定组件的位置和大小,我们将切换到setLayout(null);

    2) 更改 JLabel 的大小和位置

    我们可以直接用setBounds(int startX, int startY, int Width, int Height)方法改变JLabel的大小和位置!

    import java.awt.FlowLayout;
    import java.awt.Rectangle;
    
     import javax.swing.JFrame;
     import javax.swing.JLabel;
     import javax.swing.SwingConstants;
    
     import java.awt.Color;
    
    public class StackOver extends JFrame
    {
      private JLabel label;
    
        public StackOver() //constructor
        {
          super("Simple GUI");
          setLayout(null);
          setSize(500,300);
    
    
          label=new JLabel("Centered JLabel", JLabel.CENTER); 
          // Since it also sets the size of the JLabel, 
          //let's use the constructor to set the alignment of the text inside the JLabel.
    
          label.setOpaque(true);                //Transparency Settings
          label.setBackground(Color.pink);      //Specify background color
          //to use 'Color' class, We must import java.awt.Color;
    
          Rectangle r = this.getBounds();       //to get Frame Size
          label.setBounds(r.x+100, r.y+100, r.width-200, r.height-200);
    
          /*
          label.setHorizontalTextPosition(SwingConstants.CENTER);
          label.setVerticalTextPosition(SwingConstants.CENTER);*/
    
          add(label);
          setDefaultCloseOperation(EXIT_ON_CLOSE);
          setVisible(true);
        }
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            new StackOver();
        }
     }
    

    现在我们可以看到中间的 JLabel 文本了!

    这种方法可以直接固定所有组件(例如按钮)的大小和位置,但是即使程序运行后JFrame的窗口大小发生变化,组件的位置和大小也是固定的。

    所以如果你真的想通过这种方式设置组件,你宁愿通过在JFrame的代码上添加下面的代码来设置JFrame Resizable false

    this.setResizable(false);
    

    希望回答对您有所帮助,祝您度过愉快的一天!

    【讨论】:

    • (1-) 不要使用空布局。 Swing 旨在与布局管理器一起使用。您发布的代码不会使文本居中。 1)逻辑不考虑框架的边框,2)如果框架的大小发生变化,组件不会重新定位。
    • @camickr 啊哈,谢谢你教我!为了您的努力,现在我学到了更多关于摇摆的知识!好吧,那为了提问者的利益,修改我的帖子会更好,对吧?
    • 我会在帖子上给你投票,以表示我的感激之情。
    • @camickr 很抱歉打扰ㅠㅅㅠ 你能告诉我修改后的答案是否有任何部分需要修改,好吗?感谢您的推荐,我能够更深入地研究我所知道的方式只是众多方式之一!
    • 代码中的做法还是不对。例如,将 setSize(...) 语句更改为 setSize(500, 200),看看会发生什么。方法应该是首先设置组件的大小,然后 2) 确定组件在父容器边界内的位置。这就是布局管理的工作原理。
    猜你喜欢
    • 2011-03-18
    • 1970-01-01
    • 2018-11-12
    • 2014-07-01
    • 2012-08-15
    • 2014-10-27
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多