gpt4 book ai didi

java - BorderLayout - 防止 "center"组件成为 "cut off"

转载 作者:行者123 更新时间:2023-11-30 07:28:32 25 4
gpt4 key购买 nike

我有一个包含两个 JLabel 的 JPanel。该面板使用 BorderLayout。

一个 JLabel 放在 BorderLayout.CENTER 位置,另一个在 BorderLayout.PAGE_END

当我调整面板大小时没有足够的垂直空间来显示两个标签时,居中的标签总是被 PAGE_END 位置的标签覆盖(截断)。

由于居中标签中显示的信息比其他标签更重要,我希望居中标签重叠(或切断)其下方的标签。

似乎 BorderLayout(以及 GridBagLayout)总是从“上到下”绘制组件,“稍后”绘制的组件将覆盖之前绘制的组件。

有什么方法可以说服 BorderLayout(或任何其他 LayoutManager)假设某个组件​​应该始终“位于顶部”?

我试过用

panel.setComponentZOrder(label1, 1);
panel.setComponentZOrder(label2, 0);

但这并没有什么不同。

最佳答案

一种方法是使用符合首选大小的 GridLayout 的自定义变体。 PreferredSizeGridLayout使用 PreferredBoundable 实现就是一个例子。

附录:这是我试过的测试代码。如果不做任何更改,下部标签会“滑动”到上部标签下方,但您必须处理 horizo​​ntalAlignment 属性。

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();
}
});
}
}

关于java - BorderLayout - 防止 "center"组件成为 "cut off",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9142811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com