使JLabel文本垂直居中对齐

时间:2020-03-13 07:26:30

标签: java swing alignment jlabel layout-manager

如何使-shm文本与中心垂直和水平对齐?

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

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

setVerticalTextPosition

2 个答案:

答案 0 :(得分:1)

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

您有两个问题:

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

或者另一种选择是使用GridBagLayout。然后,您无需使用组件的对齐选项:

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

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

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

答案 1 :(得分:-2)

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

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

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

请记住,最推荐的方法是由camickr将GridBagLayout()应用于JFrame的布局。

此答案旨在告知您 这种方法也是可行的,但在正常情况下不建议使用

不建议使用此方法,因为更改框架的大小 保持组件就位,但可能会给您一些帮助 当指示组件中的组件的大小和位置 容器的使用方式可以在特殊情况下使用,例如 当需要修复它们而没有外部影响时。

为了更好地了解问题,我将仅更改您上载给我的代码,以便可以执行该代码。

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();
    }
 }

enter image description here

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

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

enter image description here

JFrame设置设置为FlowLayout(),这使得组件的位置和大小是固定的,因此我们看不到它起作用!

所以现在我们将经历以下两个过程。 1)将JFrame的布局更改为null以使用绝对布局(“不推荐,只是一种情况”) 2)更改JLabel的大小和位置 进度完成后,我们可以看到文本对齐有效!

1)更改JFrame的布局

following link: Layout Manager表明FlowLayout之外的布局太多。

Swing旨在使用布局管理器,因此,您当然应该使用上面的“布局”链接之一。

但是,要使用一种有趣的方式来绝对固定组件的位置和大小,我们将切换到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();
    }
 }

enter image description here

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

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

因此,如果您确实希望通过这种方式完全设置组件,则宁愿通过在JFrame的代码上添加以下代码来将JFrame Resizable设置为false

this.setResizable(false);

我希望答案对您有所帮助,并度过一个愉快的一天!