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

时间:2012-08-28 21:25:33

标签: 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;
    }
}

编辑:

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

}

4 个答案:

答案 0 :(得分:7)

如果容器要强制其组件与其宽度相匹配,除非您需要使用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以使计算基于传入成分

答案 1 :(得分:3)

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

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

取父母的尺寸。

答案 2 :(得分:0)

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

只需使用Oracle's template来帮助您使用此布局

之后,您只需要添加组件(没有约束),并调用它:

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

答案 3 :(得分:0)

How to Use BoxLayout 文档说:

<块引用>

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

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

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