Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why doesn't my Jpanel borderlayout work as expected?

I am adding 2 elements to a JPanel, a JLabel and a JButton. I would like them to appear one on top of each other, so I added them using BorderLayout.NORTH and SOUTH.

The problem I have is that the JLabel JButton and are sitting next to each other horizontally side to side, not on top of each other as expected. The issue may be related to the fact that I am also adding to other panels to the frame using borderlayout as shown below.

Here is an SSCE to demonstrate my problem. You will notice that if you expand the window you will see the JButton to the left of the JLabel.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class Question {
    /**
     * @param args
     */
    public static void main(String[] args) {
        gui();
    }

    public static void gui() {

        final JFrame theFrame = new JFrame();
        theFrame.setSize(550, 290);

        theFrame.setLocationRelativeTo(null);

        // options for the JComboBox
        String[] options = { ("1"), ("2"), ("3") };

        final JPanel thePanel = new JPanel();
        JLabel aMessage = new JLabel(
                "<html>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tempus<br> lacus eu ante vestibulum tincidunt. Donec venenatis rhoncus justo sit amet <br>gravida. Pellentesque habitant morbi tristique senectus et netus et malesuada<br>est ac mattis. Donec lobortis rhoncus quam. In at vulputate ipsum<br>to fix. Phasellus tempus lacus eu ante vestibulum tincidunt. Donec venenatis rhoncus<br>turpis quam sagittis arcu, non pulvinar purus leo ege.<br><br><br></html>");
        aMessage.setVisible(true);

        JButton theButton = new JButton();
        theButton
                .setText("<HTML><FONT color=\"#000099\"><U>Click here</U></FONT>"
                        + " if you would like to view some file.</HTML>");

        theButton.setBorderPainted(false);
        theButton.setOpaque(false);
        theButton.setBackground(Color.WHITE);
        theButton.setVisible(true);

        thePanel.add(aMessage, BorderLayout.NORTH);
        thePanel.add(theButton, BorderLayout.SOUTH);

        // create second panel
        final JPanel secondPanel = new JPanel();
        JLabel bMessage = new JLabel("Here's another Jlabel");
        final JComboBox cBox = new JComboBox(options);
        // would be nice to get bmessage + cBox left aligned
        secondPanel.add(bMessage);
        secondPanel.add(cBox);

        // create third panel
        final JPanel thirdPanel = new JPanel();
        JLabel cMessage = new JLabel("Here's a third message");
        String newString = ("Hello");
        JTextField stringInput = new JTextField(newString);
        stringInput.setPreferredSize(new Dimension(250, 20));
        thirdPanel.add(cMessage);
        thirdPanel.add(stringInput);


        JButton lastButton = new JButton("A Button");

        thirdPanel.add(cMessage);
        thirdPanel.add(stringInput);
        thirdPanel.add(lastButton);

        theFrame.add(thePanel, BorderLayout.NORTH);
        theFrame.add(thirdPanel, BorderLayout.SOUTH);
        theFrame.add(secondPanel, BorderLayout.CENTER);

        theFrame.setVisible(true);
    }

}
like image 822
Dawson Avatar asked Mar 16 '23 23:03

Dawson


1 Answers

Where do you set the layout of the thePanel JPanel? Answer: you don't and so it uses FlowLayout by default. Solution: set the layout to the one you want via setLayout(...)

e.g.,

thePanel.setLayout(new BorderLayout());
like image 186
Hovercraft Full Of Eels Avatar answered Apr 01 '23 06:04

Hovercraft Full Of Eels