【发布时间】:2016-08-23 21:33:15
【问题描述】:
我有一个案例,我将 JPanel 添加到 FlowLayout,但它们没有将自己与布局的底部对齐。我正在使用这个layout.setAlignOnBaseline(true),它将 JLabels 正确地对齐到面板的底部。然而,一旦这些标签被包裹在面板中,它就不再起作用了。这是我的意思的一个示例,顶部和底部有两个面板。
import javax.swing.*;
import java.awt.*;
public class BadLayout {
private static final Font font1 = new Font("Arial", Font.BOLD, 14);
private static final Font font2 = new Font("Arial", Font.BOLD, 30);
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame frame = new JFrame("Bad layout");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
FlowLayout layout = new FlowLayout(FlowLayout.LEADING, 0, 0);
layout.setAlignOnBaseline(true);
JPanel topPanel = new JPanel();
topPanel.setLayout(layout);
topPanel.setBackground(Color.BLACK);
for (int i = 0; i < 10; i++) {
JLabel label = new JLabel("Foo");
label.setForeground(Color.WHITE);
label.setBackground(Color.RED);
label.setOpaque(true);
label.setFont(i % 2 == 0 ? font1 : font2);
JPanel subPanel = new JPanel();
subPanel.setLayout(layout);
subPanel.setBackground(Color.RED);
subPanel.add(label);
subPanel.setAlignmentY(Component.BOTTOM_ALIGNMENT);
topPanel.add(subPanel);
}
JPanel bottomPanel = new JPanel();
bottomPanel.setLayout(layout);
bottomPanel.setBackground(Color.DARK_GRAY);
for (int i = 0; i < 10; i++) {
JLabel label = new JLabel("Foo");
label.setForeground(Color.WHITE);
label.setBackground(Color.RED);
label.setOpaque(true);
label.setFont(i % 2 == 0 ? font1 : font2);
bottomPanel.add(label);
}
JPanel parentPanel = new JPanel();
parentPanel.setLayout(new BorderLayout());
parentPanel.add(topPanel, BorderLayout.NORTH);
parentPanel.add(bottomPanel, BorderLayout.SOUTH);
frame.getContentPane().add(parentPanel);
frame.pack();
frame.setVisible(true);
});
}
}
如果您运行此代码,您会注意到顶部面板在面板中具有较小的“Foo”,而底部的面板具有我希望的所需“底部对齐”行为。任何想法如何让子 JPanel 表现相同?
【问题讨论】:
标签: java swing layout layout-manager flowlayout