我有一个包含两个JLabel的JPanel。该面板使用BorderLayout。
一个JLabel被置于BorderLayout.CENTER
位置,另一个被置于BorderLayout.PAGE_END
当我调整面板大小以使其没有足够的垂直空间来显示两个标签时,居中的标签总是被PAGE_END
位置的标签覆盖(切断)。
由于居中标签中显示的信息比另一个更重要,我希望居中的标签重叠(或切断)其下方的标签。
似乎BorderLayout(以及GridBagLayout)总是从“从上到下”绘制组件,而“后来”绘制的组件将覆盖之前绘制的组件。
有没有什么方法可以说服BorderLayout(或任何其他LayoutManager)假设某个组件应该总是“在顶部”?
我尝试使用
panel.setComponentZOrder(label1, 1);
panel.setComponentZOrder(label2, 0);
但这并没有什么不同。
答案 0 :(得分:2)
一种方法是使用尊重首选尺寸的GridLayout
自定义变体。使用PreferredBoundable
实现的PreferredSizeGridLayout
就是一个例子。
附录:这是我试过的测试代码。如果没有更改,较低的标签会“滑动”在鞋帮下方,但您必须处理horizontalAlignment
属性。
public class PreferredLayoutTest extends JPanel {
public PreferredLayoutTest() {
this.setLayout(new PreferredSizeGridLayout(0, 1));
this.add(createLabel("One"));
this.add(createLabel("Two"));
}
private JLabel createLabel(String s) {
JLabel label = new JLabel(s);
label.setOpaque(true);
label.setBackground(Color.lightGray);
label.setFont(label.getFont().deriveFont(36f));
return label;
}
private void display() {
JFrame f = new JFrame("PreferredLayoutTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new PreferredLayoutTest().display();
}
});
}
}
答案 1 :(得分:2)
如果中心标签中有足够的文字,请在顶级容器上调用setMinimumSize(Dimension)
。