java 使用 boxlayout,如何让组件填充所有可用的水平宽度?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/12167754/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using boxlayout, how do I get components to fill all available horizontal width?
提问by davidahines
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;
}
}
采纳答案by Reimeus
Because of the fact that BoxLayout is guided by a components preferred size, you could use:
由于 BoxLayout 由组件首选大小引导,您可以使用:
JPanel middlePanel = new JPanel() {
public Dimension getPreferredSize() {
return outerPanel.getSize();
};
};
taking the dimensions of the parent.
取父级的尺寸。
回答by Jacob Raihle
If the container wants to force its components to all match its width, there are many alternatives that could do this better unless you needto use BoxLayout
. One is the standard GridBagLayout
. Given a container panel
and three components a
, b
and c
, the code would be:
如果容器想要强制其组件全部匹配其宽度,则有许多替代方法可以做得更好,除非您需要使用BoxLayout
. 一是标准GridBagLayout
。给定一个容器panel
和三个组件a
, b
and 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);
If the component wants to match its container's width, 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.
如果组件想要匹配其容器的 width,我会改为编写组件的构造函数来接收对容器的引用并覆盖getPreferredSize
以基于传入的组件进行计算。
回答by lapsus63
A good workaround for me was to use SpringLayout.
对我来说一个很好的解决方法是使用SpringLayout。
Just use Oracle's templateto help you using this layout
只需使用Oracle 的模板来帮助您使用此布局
After that, you just need to add your components (without constraints), and call this :
之后,您只需要添加组件(无限制),并调用它:
SpringUtilities.makeCompactGrid(yourPanel, x, 1, 0, 0, 0, 0);
// x stands for rowCount. Zeros are margins.