BorderLayout - 防止“中心”组件被“切断”

时间:2012-02-04 17:24:50

标签: java swing layout-manager

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

一个JLabel被置于BorderLayout.CENTER位置,另一个被置于BorderLayout.PAGE_END

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

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

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

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

我尝试使用

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

但这并没有什么不同。

2 个答案:

答案 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)