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;
}
}
答案 0 :(得分:7)
如果容器要强制其组件与其宽度相匹配,除非您需要使用BoxLayout
,否则有许多替代方案可以做得更好。一个是标准GridBagLayout
。给定容器panel
和三个组件a
,b
和c
,代码为:
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)
...