Aligning JLabels in BoxLayout

12,800

Solution 1

Consider having topLabel not use the default FlowLayout but rather something that makes its contents fill it up such as BorderLayout.

topLabel.setLayout(new BorderLayout());

Next make sure that you set the display's horizontal alignment, not its alignmentX to the right:

display.setHorizontalAlignment(SwingConstants.RIGHT);

Similar changes should be made for your notice JLabel and its container.

Solution 2

I add few line of code because I like BoxLayout. I have almost the same problems in align components few hours ago.

If we want to acheive something like this

//  +----------------------------------+
//  |  Label1  |            |  Label2  |
//  +----------------------------------+

You have only to put a "Box.createHorizontalGlue()" between the two.

If instead we want something like this:

//  +----------------------------------+
//  |  Label1  |                       |
//  |----------+            +----------|
//  |                       |  Label2  |
//  +----------------------------------+

We have to put the labels inside two differen JPanel, setting a different AlignmentX to them. This is because in the layout all the components should have the same alignmentX. To avoid this restriction we can do something like this:

//  +-----------------------------------------+
//  |  Label1  |   label1 is inside a JPanel  |
//  +----------+ - - - - - - - - - - - - - - -+
//  + - - - - - - - - - - - - - - -+----------+
//  |  label2 also                 |  Label2  |
//  +-----------------------------------------+

(don't mind about the space between the two panel, is only for graphic) This can be done with this code:

mainPanel = new JPanel();
mainPanel.setLayout(new BoxLayout(mainPanel,BoxLayout.PAGE_AXIS));

JLabel lbl1 = new JLabel("Label1");
JPanel p1 = new JPanel();
p1.setOpaque(false);
p1.setLayout(new BorderLayout(0, 0));
p1.add(lbl1, BorderLayout.CENTER);

JLabel lbl2 = new JLabel("Label1");
JPanel p2 = new JPanel();
p2.setOpaque(false);
p2.setLayout(new BorderLayout(0, 0));
p2.add(lbl2, BorderLayout.CENTER);

mainPanel.add(p1);
mainPanel.add(p2);

I hope this is useful.

Solution 3

You can simply use BorderLayout() :

public static void goGUI() {

        ....

        topLabel = new JPanel(new BorderLayout());
        bottomLabel = new JPanel(new BorderLayout());

        ....

        topLabel.add(display, BorderLayout.EAST);
        bottomLabel.add(notice, BorderLayout.WEST);


    }

Also remove these calls :

 display.setAlignmentX(Component.RIGHT_ALIGNMENT);
 notice.setAlignmentX(Component.LEFT_ALIGNMENT);
Share:
12,800
charlieshades
Author by

charlieshades

Updated on June 04, 2022

Comments

  • charlieshades
    charlieshades about 2 years

    I've been searching around for days trying to find the answer to this, and I can't find out what's wrong. What I want to do is make it so the top JLabel (called display) align to the right and the bottom JLabel (called notice) to align to the left. Neither seems to want to do either. From what I've read, what I have should work, but it doesn't. Help?

    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    import javax.swing.border.Border;
    
    public class Calculator {
    
        private static JButton clear, add, subtract, multiply, divide, equals, point, zero, one, two, three, four, five, six, seven, eight, nine;
        private static JLabel display, notice, blank1, blank2, blank3;
        private static JPanel mainPanel, buttonPanel, topLabel, bottomLabel;
    
        public static void goGUI() {
    
            JFrame frame = new JFrame("Calculator");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setPreferredSize(new Dimension(600,300));
            mainPanel = new JPanel();
            mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
            frame.setContentPane(mainPanel);
            Border empty = BorderFactory.createEmptyBorder(10,10,10,10);
            mainPanel.setBorder(empty);
    
            buttonPanel = new JPanel(new GridLayout(5,4, 5,5));
            Border buttonBorder = BorderFactory.createEmptyBorder(10,0,10,0);
            buttonPanel.setBorder(buttonBorder);
    
            topLabel = new JPanel();
            bottomLabel = new JPanel();
    
            clear = new JButton("C");
            add = new JButton("+");
            subtract = new JButton("-");
            multiply = new JButton("*");
            divide = new JButton("/");
            equals = new JButton("=");
            point = new JButton(".");
            zero = new JButton("0");
            one = new JButton("1");
            two = new JButton("2");
            three = new JButton("3");
            four = new JButton("4");
            five = new JButton("5");
            six = new JButton("6");
            seven = new JButton("7");
            eight = new JButton("8");
            nine = new JButton("9");
    
            // Here I added ActionListeners to all the buttons...
    
            display = new JLabel("0");
            display.setAlignmentX(Component.RIGHT_ALIGNMENT);
            notice = new JLabel("*Maximum 19 digits - Order of operations not taken into account*");
            notice.setAlignmentX(Component.LEFT_ALIGNMENT);
            blank1 = new JLabel();
            blank2 = new JLabel();
            blank3 = new JLabel();
    
            buttonPanel.add(clear);
            buttonPanel.add(blank1);
            buttonPanel.add(blank2);
            buttonPanel.add(blank3);
            buttonPanel.add(seven);
            buttonPanel.add(eight);
            buttonPanel.add(nine);
            buttonPanel.add(divide);
            buttonPanel.add(four);
            buttonPanel.add(five);
            buttonPanel.add(six);
            buttonPanel.add(multiply);
            buttonPanel.add(one);
            buttonPanel.add(two);
            buttonPanel.add(three);
            buttonPanel.add(subtract);
            buttonPanel.add(zero);
            buttonPanel.add(point);
            buttonPanel.add(equals);
            buttonPanel.add(add);
    
            topLabel.add(display);
            bottomLabel.add(notice);
    
            mainPanel.add(topLabel);
            mainPanel.add(buttonPanel);
            mainPanel.add(bottomLabel);
    
            frame.pack();
            frame.setVisible(true);
    
        } //end goGUI
    
        //ActionListener classes went here...
    
        public static void main(String[] args) {
    
            try {
                // Set cross-platform Java L&F (also called "Metal")
                UIManager.setLookAndFeel(
                    UIManager.getCrossPlatformLookAndFeelClassName());
            } 
            catch (Exception e) {}
    
            goGUI();
    
        } //end main
    } //end Calculator
    

    I removed all ActionListener stuff for clarity. But this is the layout that I can't fix.