Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using boxlayout, how do I get components to fill all available horizontal width?

Tags:

java

swing

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.HeadlessException;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/**
 * @author dah01
 */
public class Main {
    private static int panelNumber = 1;
    public static final String fillerText = ""
            + "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec "
            + "placerat aliquam magna, in faucibus ante pharetra porta. "
            + "Vestibulum ante ipsum primis in faucibus orci luctus et ultrices "
            + "posuere cubilia Curae; Quisque eu dui ligula. Donec consequat "
            + "fringilla enim eu tempus. Ut pharetra velit id sapien vehicula "
            + "scelerisque. Proin sit amet tellus enim, et gravida dui. Ut "
            + "laoreet tristique tincidunt. Integer pharetra pulvinar neque id "
            + "dignissim. Praesent gravida dapibus ornare. Aenean facilisis "
            + "consectetur tincidunt. Donec ante tellus, vehicula vitae "
            + "ultrices eget, scelerisque cursus turpis. Quisque volutpat odio "
            + "sed risus posuere adipiscing. In pharetra elit id risus ornare "
            + "ut bibendum orci luctus. In sollicitudin gravida neque quis "
            + "lobortis. Morbi id justo enim. Aliquam eget orci lorem.";
    public static void main(String[] args) {
        JPanel innerPanelOne = getPanel();

        //SECOND PANEL
        JPanel innerPanelTwo = getPanel();

        //MIDDLE PANEL
        JPanel middlePanel = new JPanel();
        middlePanel.setBackground(Color.RED);
        middlePanel.setLayout(new BoxLayout(middlePanel, BoxLayout.PAGE_AXIS));
        middlePanel.add(innerPanelOne);
        middlePanel.add(innerPanelTwo);

        //OUTER PANEL
        JPanel outerPanel = new JPanel();
        outerPanel.setBackground(Color.BLUE);
        outerPanel.add(middlePanel);

        createAndShowGUI(outerPanel);
    }

    private static void createAndShowGUI(JPanel outerPanel) throws HeadlessException {
        //FRAME
        JFrame frame = new JFrame();
        frame.setContentPane(outerPanel);
        frame.setSize(500, 500);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    private static JPanel getPanel() {
        //TEXT AREA
        JTextArea t = new JTextArea(fillerText);
        t.setWrapStyleWord(true);
        t.setLineWrap(true);


        //Scroll
        JScrollPane scrollOne = new JScrollPane();
        scrollOne.setViewportView(t);

        //Label
        JLabel l = new JLabel("LABEL " +panelNumber++);
        //FIRST PANEL
        JPanel p = new JPanel();
        p.setLayout(new BorderLayout());
        p.setBackground(Color.GREEN);
        p.add(l,BorderLayout.NORTH);
        p.add(scrollOne,BorderLayout.SOUTH);

        t.setMaximumSize(new Dimension(1920,1080));
        p.setMaximumSize(new Dimension(1920,1080));
        l.setMaximumSize(new Dimension(1920,1080));
        return p;
    }
}

EDIT:

package com.protocase.notes.views;

import com.protocase.notes.controller.NotesController;
import com.protocase.notes.model.Note;
import com.protocase.notes.model.User;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.border.BevelBorder;

/**
 * @author dah01
 */
public class NotesPanel extends JPanel {

    public static void main(String[] args) {
        JFrame f = new JFrame();
        f.setSize(500, 500);
        Note note = new Note();
        User u = new User();
        note.setCreator(u);
        note.setLastEdited(u);
        note.setDateCreated(new Date());
        JPanel panel = new JPanel();
        panel.add(new NotesPanel(note, null));
        panel.add(new NotesPanel(note, null));
        panel.setBackground(Color.red);

        panel.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
        f.setContentPane(panel);
        f.setVisible(true);
    }
    // <editor-fold defaultstate="collapsed" desc="Attributes">
    private Note note;
    private NotesController controller;
    //</editor-fold>
    // <editor-fold defaultstate="collapsed" desc="Getters N' Setters">

    public NotesController getController() {
        return controller;
    }

    public void setController(NotesController controller) {
        this.controller = controller;
    }

    public Note getNote() {
        return note;
    }

    public void setNote(Note note) {
        this.note = note;
    }
    //</editor-fold>
    // <editor-fold defaultstate="collapsed" desc="Constructor">

    /**
     * Sets up a note panel that shows everything about the note.
     * @param note 
     */
    public NotesPanel(Note note, NotesController controller) {
        // -- Setup the layout manager.
        this.setBackground(new Color(199, 187, 192));
        this.setLayout(new GridBagLayout());
        this.setBorder(new BevelBorder(BevelBorder.RAISED));
        GridBagConstraints c = new GridBagConstraints();

        // -- Setup the creator section.
        JLabel creatorLabel = new JLabel("Note by " + note.getCreator() + " @ " + note.getDateCreated());
        creatorLabel.setAlignmentX(JLabel.LEFT_ALIGNMENT);
        c.fill = GridBagConstraints.HORIZONTAL;

        c.gridy = 0;
        c.weightx = 1;
        c.weighty = 0.3;
        this.add(creatorLabel, c);

        // -- Setup the notes area.
        JTextArea notesContentsArea = new JTextArea(note.getContents());
        notesContentsArea.setEditable(false);
        notesContentsArea.setLineWrap(true);
        notesContentsArea.setWrapStyleWord(true);



        JScrollPane scrollPane = new JScrollPane(notesContentsArea);
        scrollPane.setAlignmentX(JScrollPane.LEFT_ALIGNMENT);


        c.gridy = 1;


        this.add(scrollPane, c);

        // -- Setup the edited by label.
        JLabel editorLabel = new JLabel(" -- Last edited by " + note.getLastEdited() + " at " + note.getDateModified());
        editorLabel.setAlignmentX(Component.LEFT_ALIGNMENT);


        c.gridy = 2;


        this.add(editorLabel, c);

        // -- Add everything to the view.

        this.setBackground(Color.yellow);
        //this.add(creatorLabel);
        //this.add(scrollPane);
        //this.add(editorLabel);
    }
    //</editor-fold>

    @Override
    public Dimension getPreferredSize() {
        Dimension d = super.getPreferredSize();
        d.width = this.getParent().getSize().width;
        return d;
    }

}
like image 879
davidahines Avatar asked Aug 28 '12 21:08

davidahines


2 Answers

If the container wants to force its components to all match its width, there are many alternatives that could do this better unless you need to use BoxLayout. One is the standard GridBagLayout. Given a container panel and three components a, b and c, the code would be:

panel.setLayout(new GridBagLayout());
GridBagConstraints cons = new GridBagConstraints();
cons.fill = GridBagConstraints.HORIZONTAL;
cons.weightx = 1;
cons.gridx = 0;

panel.add(a, cons);
panel.add(b, cons);
panel.add(c, cons);

If the component wants to match its container's width - and this is typically not a good idea, I would instead write the component's constructor to receive a reference to the container and override getPreferredSize to base the calculations on the passed-in component. But layout should almost always be up to the parent.

like image 113
Jacob Raihle Avatar answered Nov 14 '22 22:11

Jacob Raihle


Because of the fact that BoxLayout is guided by a components preferred size, you could use:

JPanel middlePanel = new JPanel() {
   public Dimension getPreferredSize() {
       return outerPanel.getSize();
   };
};

taking the dimensions of the parent.

like image 33
Reimeus Avatar answered Nov 14 '22 23:11

Reimeus