Search code examples
javaswinglayout-managerboxlayout

How to make BoxLayout left-align properly?


I created a Box which contains a JLabel, and a JScrollPane with a JTextArea. However there is always some space on left side of JLabel:

Jlabel not fully left-aligned

Full demonstration code:

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

Solution

  • How to Use BoxLayout (The Java™ Tutorials > Creating a GUI With JFC/Swing > Laying Out Components Within a Container)
    The X alignments affect not only the components' positions relative to each other, but also the location of the components (as a group) within their container.

    For this reason, it is necessary to setAlignmentX(Component.LEFT_ALIGNMENT) not only for JLabel but also for 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);
      }
    }