Aligning JLabels in BoxLayout
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);
charlieshades
Updated on June 04, 2022Comments
-
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 (callednotice
) 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.