Как правильно настроить BoxLayout по левому краю? - PullRequest
1 голос
/ 06 ноября 2019

Я создал Box, который содержит JLabel, и JScrollPane с JTextArea. Однако с левой стороны от JLabel всегда есть место:

Jlabel not fully left-aligned

Полный демонстрационный код:

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

public class BoxAlignmentTest extends JFrame {

    public static void main(String[] args) {
        BoxAlignmentTest test = new BoxAlignmentTest();
        test.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        test.setSize(500, 200);
        test.setVisible(true);
    }

    public BoxAlignmentTest() throws HeadlessException {
        Box box = Box.createVerticalBox();
        setContentPane(box);

        JLabel label = new JLabel("This label isn't fully left-aligned.");
        label.setOpaque(true);
        label.setBackground(Color.orange);
        label.setAlignmentX(Component.LEFT_ALIGNMENT);  // Set left alignment

        box.add(label);
        box.add(new JScrollPane(new JTextArea("This is a text area.")));
    }
}

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Как использовать BoxLayout (Учебные руководства Java ™> Создание графического интерфейса с помощью JFC / Swing> Размещение компонентов в контейнере)
Выравнивания X влияют не только на позиции компонентовотносительно друг друга, но также и расположение компонентов (как группы) в их контейнере.

По этой причине необходимо setAlignmentX(Component.LEFT_ALIGNMENT) не только для JLabel, но и дляJScrollPane.

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

public class BoxAlignmentTest2 extends JFrame {
  public static void main(String[] args) {
    EventQueue.invokeLater(() -> {
      BoxAlignmentTest2 test = new BoxAlignmentTest2();
      test.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      test.setSize(500, 200);
      test.setVisible(true);
    });
  }

  public BoxAlignmentTest2() throws HeadlessException {
    JLabel label = new JLabel("This label isn't fully left-aligned.");
    label.setOpaque(true);
    label.setBackground(Color.orange);
    label.setAlignmentX(Component.LEFT_ALIGNMENT); // Set left alignment

    JScrollPane scroll = new JScrollPane(new JTextArea("This is a text area."));
    scroll.setAlignmentX(Component.LEFT_ALIGNMENT); // <- add

    Box box = Box.createVerticalBox();
    box.add(label);
    box.add(scroll);

    add(box); // = getContentPane().add(box, BorderLayout.CENTER);
  }
}
0 голосов
/ 06 ноября 2019

использовать setBorder (BorderFactory.createEmptyBorder (int сверху, int слева, int снизу, int справа); ref: https://docs.oracle.com/javase/7/docs/api/javax/swing/BorderFactory.html

...