BorderLayout - предотвращает "обрезание" компонента "center" - PullRequest
2 голосов
/ 04 февраля 2012

У меня есть JPanel, который содержит два JLabel.Панель использует BorderLayout.

Один JLabel помещается в положение BorderLayout.CENTER, другой - в BorderLayout.PAGE_END

Когда я изменяю размер панели так, чтобы на ней не было достаточно вертикального пространства для отображения обеих меток, центрированная меткавсегда перезаписывается (обрезается) меткой в ​​позиции * 1007. *) ярлык под ним.

Кажется, что BorderLayout (и GridBagLayout также) всегда рисует компоненты сверху вниз, а те, которые нарисованы позже, будут перезаписывать те, что были нарисованы ранее.

Есть ли какой-нибудь способ убедить BorderLayout (или любой другой LayoutManager) предположить, что определенный компонент всегда должен быть «наверху»?

Я пытался использовать

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

, но это не имело значения.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2012

Вызовите setMinimumSize(Dimension) в контейнере верхнего уровня, когда в центральной метке достаточно текста.

2 голосов
/ 04 февраля 2012

Один из подходов заключается в использовании пользовательского варианта GridLayout, который учитывает предпочтительные размеры. PreferredSizeGridLayout с использованием реализации PreferredBoundable является примером.

Приложение: Вот тестовый код, который я пробовал. Без изменений нижняя метка «скользит» под верхней, но вам придется обрабатывать свойство 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();
            }
        });
    }
}
...