使用 boxlayout,如何让组件填充所有可用的水平宽度


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;
    }
}

编辑:

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;
    }
}

如果容器想要强制其组件都与其宽度匹配,则有许多替代方案可以做得更好,除非您需要使用 BoxLayout 。一个是标准GridBagLayout。给定一个容器panel和三个组件abc,代码将是:

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);

如果组件想要匹配其容器的宽度 - 这通常不是一个好主意,我会编写组件的构造函数来接收对容器的引用并重写getPreferredSize以基于传入组件进行计算。但布局几乎总是应该由父级决定。

由于 BoxLayout 由组件首选大小指导,因此您可以使用:

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

取父项的尺寸。

对我来说,一个很好的解决方法是使用SpringLayout。

只需使用 Oracle 的模板即可帮助您使用此布局

之后,你只需要添加你的组件(没有约束(,并调用这个:

SpringUtilities.makeCompactGrid(yourPanel, x, 1, 0, 0, 0, 0);
// x stands for rowCount. Zeros are margins.

如何使用BoxLayout文档说:

如果所有组件都具有相同的 X 对齐方式,则所有组件的宽度与其容器一样宽。

因此,在使用 BoxLayout 时,为所有组件设置相同的 X 对齐方式就足够了:

        c1.setAlignmentX(Component.CENTER_ALIGNMENT)
        c2.setAlignmentX(Component.CENTER_ALIGNMENT)
        ...

最新更新