Сделать текст JLabel вертикально выровненным по центру - PullRequest
0 голосов
/ 13 марта 2020

Как сделать текст JLabel вертикально и горизонтально выровненным по центру?

Мне нужно использовать setHorizontalTextPosition и setVerticalTextPosition. Может ли это быть достигнуто с помощью этих 2?

Я пробовал, но текст остается вверху.

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

Ответы [ 2 ]

1 голос
/ 13 марта 2020

Я пробовал, но текст остается сверху.

У вас есть две проблемы:

  1. Эндрю решил первую проблему. Вы используете неправильный метод.
  2. Далее вы используете неправильный макет. FlowLayout отображает компоненты только в одной строке, поэтому компонент всегда будет наверху. Не меняйте менеджер раскладок. Менеджер по умолчанию для JFrame - BorderLayout. Когда вы добавляете компонент к CENTER (который используется по умолчанию, если вы не указали ограничение), размер компонента будет заполнен по всему кадру. Тогда свойства «выравнивания» будут управлять положением текста в пределах размера, выделенного для метки.

Или другой вариант - использовать GridBagLayout. Тогда вам не нужно играть с параметрами выравнивания компонента:

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

Попробуйте оба варианта, так как оба могут быть эффективными в разных ситуациях.

Прочтите учебник Swing на Менеджеры макетов , чтобы лучше понять, как работает каждый менеджер макетов.

0 голосов
/ 13 марта 2020

Мне очень жаль, что я не знаю, почему метод setHorizontTextPosition и метод setVerticalTextPosition не работают.

Но я дам вам знать, что существует несколько способов сортировки текста в метку путем вставки параметров выравнивания со строкой при создании метки.

Прежде всего, ответ camickr - лучший ответ, потому что Swing был разработан для использования с менеджерами компоновки !!

Пожалуйста, помните, что наиболее рекомендуемым методом является применение GridBagLayout () к макету JFrame с помощью camickr.

Этот ответ предназначен для информирования вас Этот метод также возможен, но не рекомендуется в обычном случае

Использование этого метода не рекомендуется, поскольку изменение размера рамки сохраняет компоненты на месте, но может дать вам небольшая помощь, когда указано, что размер и расположение компонентов в контейнере используются таким образом, который может быть использован в особых случаях, с например, когда их нужно исправить без внешнего воздействия.

Чтобы получить более полное представление о проблеме, я просто изменю код, который вы загрузили мне, чтобы он мог выполняться.

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(), что делает расположение и размер компонентов фиксированными, поэтому мы не могли видеть, как это работает!

Итак, теперь мы ' переходим к go через следующие два процесса. 1) Изменив макет JFrame на null, чтобы использовать Absolute Layout («не рекомендуется, просто случай»). 2) Изменив размер и расположение JLabel после процесса, мы увидим, что выравнивание текста работает!

1) Изменение макета JFrame

следующая ссылка : Диспетчер макетов показывает, что существует множество макетов вне FlowLayout.

Swing is предназначен для использования диспетчера макетов , поэтому, конечно, вы должны использовать одну из приведенных выше ссылок на макет.

Но, чтобы использовать интересный способ, абсолютно точно фиксирующий расположение и размер компонентов, перейдем на setLayout(null);!

2) Изменение размера и местоположения JLabel

Мы можем напрямую изменить размер и положение JLabel с помощью setBounds(int startX, int startY, int Width, int Height) method!

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 Resizable false на добавив код ниже к коду JFrame

this.setResizable(false);

Я надеюсь, что ответ был полезен для вас, и желаем вам спокойного дня!

...