一个单独的布局管理器很少能满足您的所有需求.相反,您可以使用复合布局方法.
也就是说,将每个单独的布局要求分成一个单独的组件,并使用它自己的布局管理器.然后将所有这些添加到主组件中,管理总体要求.
举个例子
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;
public class SimpleGridBagLayout {
public static void main(String[] args) {
new SimpleGridBagLayout();
}
public SimpleGridBagLayout() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
add(createLabel("XXX-XXX", Color.BLUE), gbc);
JPanel panel = new JPanel();
panel.add(createLabel("Y-Y", Color.RED));
panel.add(createLabel("ZZZZZ---ZZZZZ", Color.GREEN), gbc);
gbc.gridx++;
gbc.weightx = 1;
add(panel, gbc);
}
protected JLabel createLabel(String text, Color border) {
JLabel label = new JLabel(text);
label.setBorder(new LineBorder(border));
return label;
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 100);
}
}
}
这里有很多因素在起作用.子组件的首选大小和最小大小将对可用大小较小时布局管理器布局组件的方式产生重大影响.
更新
public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
add(createLabel("XXX-XXX", Color.BLUE), gbc);
JPanel panel = new JPanel(new GridBagLayout());
gbc = new GridBagConstraints();
gbc.gridx = 0;
panel.add(createLabel("Y-Y", Color.RED), gbc);
gbc.gridx = 1;
panel.add(createLabel("ZZZZZ---ZZZZZ", Color.GREEN), gbc);
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.weightx = 1;
add(panel, gbc);
}
更新
现在有了“不缩水”的进度条
public class TestPane extends JPanel {
public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
add(createLabel("XXX-XXX", Color.BLUE), gbc);
JPanel panel = new JPanel(new GridBagLayout());
gbc = new GridBagConstraints();
gbc.gridx = 0;
panel.add(createLabel("Y-Y", Color.RED), gbc);
gbc.gridx = 1;
MyProgressBar pb = new MyProgressBar();
panel.add(pb, gbc);
gbc = new GridBagConstraints();
gbc.gridx = 1;
gbc.weightx = 1;
add(panel, gbc);
}
protected JLabel createLabel(String text, Color border) {
JLabel label = new JLabel(text);
label.setBorder(new LineBorder(border));
return label;
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 100);
}
}
public class MyProgressBar extends JProgressBar {
@Override
public Dimension getPreferredSize() {
Dimension ps = super.getPreferredSize();
ps.width = 75;
return ps;
}
@Override
public Dimension getMinimumSize() {
return getPreferredSize();
}
}