我有以下布局:
红色,蓝色和绿色部分是JPanel。在红色部分,我有四个JLabel。现在,如果我调整JFrame的大小,标题标签始终位于中心位置。但我更愿意,如果它们在红色部分均匀分布。我应该使用哪种布局?
答案 0 :(得分:6)
使用GridLayout(1,0)作为顶级JPanel。这两个数字表示1行和可变数量的列。如果您使用的是JLabel,这就足够了,特别是如果将JLabels对齐常量设置为SwingConstants.CENTER。如果您使用的是填充网格插槽的组件,例如JButtons,那么您可能需要使用GridLayout构造函数的其他变体,例如GridLayout(1,0,?,0)。是一个数字告诉GridLayout插槽之间应该有多少水平间隔。
当然,整个GUI会使用BorderLayout。
如需更多更好的信息,请查看Lesson: Laying Out Components Within a Container和A Visual Guide to Layout Managers
例如:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.*;
public class LayoutEg {
private static void createAndShowGui() {
String[] labelStrings = {"One", "Two", "Three", "Four"};
JPanel topPanel = new JPanel(new GridLayout(1, 0));
for (String labelString : labelStrings) {
// create labels and center the text
topPanel.add(new JLabel(labelString, SwingConstants.CENTER));
}
topPanel.setBackground(Color.red);
JPanel centerPanel = new JPanel();
centerPanel.setBackground(Color.blue);
// setting preferred size for demonstration purposes only
centerPanel.setPreferredSize(new Dimension(700, 400));
JPanel bottomPanel = new JPanel();
bottomPanel.setBackground(Color.green);
// main panel uses BorderLayout
JPanel mainPanel = new JPanel(new BorderLayout());
mainPanel.add(centerPanel, BorderLayout.CENTER);
mainPanel.add(topPanel, BorderLayout.PAGE_START);
mainPanel.add(bottomPanel, BorderLayout.PAGE_END);
JFrame frame = new JFrame("LayoutEg");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
答案 1 :(得分:4)
对框架的内容窗格使用BorderLayout,并为标题面板使用1行和4列的GridLayout。
有关教程,请参阅http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html和http://docs.oracle.com/javase/tutorial/uiswing/layout/grid.html。
如果您不希望为每个标签分配相同的宽度,但实际上每个标签之间需要相同的空格,您也可以使用BoxLayout,并在每个标签之间(以及面板边框之间)添加胶水和标签:
p.setLayout(new BoxLayout(p, BoxLayout.X_AXIS));
p.add(Box.createHorizontalGlue());
p.add(new JLabel("Label"));
p.add(Box.createHorizontalGlue());
p.add(new JLabel("Long Label"));
p.add(Box.createHorizontalGlue());
p.add(new JLabel("Very long Label"));
p.add(Box.createHorizontalGlue());
p.add(new JLabel("Extremely long Label"));
p.add(Box.createHorizontalGlue());
答案 2 :(得分:3)
BorderLayout
作为主框架,并使用NORTH
,CENTER
和SOUTH
个地方。Box.createVerticalStrut(size)
。BoxLayout
将标签打包成行。GridBagLayout
将面板置于另一个面板中心。 这是一个简短的例子:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagLayout;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Prototype extends JFrame {
public Prototype() {
JPanel labelPanel = new JPanel();
labelPanel.setLayout(new BoxLayout(labelPanel, BoxLayout.LINE_AXIS));
labelPanel.add(new JLabel("First"));
labelPanel.add(Box.createHorizontalStrut(10));
labelPanel.add(new JLabel("Second"));
labelPanel.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
labelPanel.setOpaque(false);
JPanel bottomPanel = new JPanel();
bottomPanel.add(Box.createVerticalStrut(15));
bottomPanel.setBackground(Color.GREEN);
JPanel centerPanel = new JPanel();
centerPanel.add(Box.createRigidArea(new Dimension(200, 300)));
centerPanel.setBackground(Color.BLUE);
JPanel northPanel = new JPanel(new GridBagLayout());
northPanel.add(labelPanel);
northPanel.setBackground(Color.RED);
JPanel panel = new JPanel(new BorderLayout());
panel.add(northPanel, BorderLayout.NORTH);
panel.add(centerPanel, BorderLayout.CENTER);
panel.add(bottomPanel, BorderLayout.SOUTH);
add(panel);
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new Prototype();
}
}
答案 3 :(得分:2)
使用MigLayout。
不,说真的,我曾经疯狂地尝试让Java布局正常工作。然后我开始维护一些使用MigLayouts的软件,大约一周后我可以做任何我想做的事情。有一个很好的cheat sheet看起来非常令人生畏,但它非常有帮助。
使用MigLayout,要在JPanel中均匀分布标签,您可以:
// the "fillx" means that the layout will expand to take up all available horizontal space
JPanel panel = new JPanel(new Miglayout("fillx"));
// the "growx" means that the component will expand to take up all available horizontal space
add(new JLabel("Work items"), "growx");
add(new JLabel("Change set"), "growx");
add(new JLabel("Files"), "growx");
add(new JLabel("Source code"), "growx");
答案 4 :(得分:1)
gridLayout,将标签放入网格布局并将行设置为1,将列设置为4(每个标签为1行)
http://www.javabeginner.com/java-swing/java-gridlayout-class-example
答案 5 :(得分:0)
GridBagLayout是一种方法。将weightx值设置为1.0。
答案 6 :(得分:0)
要使标签水平均匀分布 - 在红色面板中 - 使用带有X AXIS方向的BoxLayout并在每个标签之间加上“胶水” - 更多信息 -
http://docs.oracle.com/javase/tutorial/uiswing/layout/box.html