Как добавить на панель две метки предпочтительного размера с помощью BorderLayout?

Я пытаюсь добавить метку к северу и югу от панели и добавить панель в центр моего кадра. Если я сам не указываю размер меток, программа идеальна, но когда я задаю им конкретный размер:

label.setPreferredSize(di);
label2.setPreferredSize(di);

становится грязно! Однако размер панели и рамы больше и (100,100) Есть идеи?

import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;


import javax.swing.JFrame;

public class BorderLayoutDemo2 {

    public static void main(String args[])
    {
        Frame frame = new Frame();
    }
}

class Frame extends JFrame
{

    private static final long serialVersionUID = 1L;

    public Frame(){
        setSize(500,500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Dimension di = new Dimension(50,50);
        Dimension dim = new Dimension(200,200);

        JPanel panel = new JPanel();
        panel.setPreferredSize(dim);

        JLabel label = new JLabel("Here is my label");
        JLabel label2 = new JLabel("Here is my label2");



        JMenuBar menu = new JMenuBar();
        JMenu setting = new JMenu("Setting");
        JMenuItem exit = new JMenuItem("Exit");
        JMenuItem add = new JMenuItem("Add");
        setting.add(add);
        setting.add(exit);
        menu.add(setting);

        label.setPreferredSize(di);
        label2.setPreferredSize(di);

        panel.add(label,BorderLayout.NORTH);
        panel.add(label2,BorderLayout.SOUTH);

        add(menu,BorderLayout.NORTH);
        add(panel,BorderLayout.CENTER);


        pack();
        setVisible(true);
    }

}

person Bernard    schedule 26.09.2012    source источник
comment
Вы не можете. Методы предпочтительного/минимального/максимального размера являются предложениями, которые менеджеры компоновки могут игнорировать, что и делает BorderLayout.   -  person MadProgrammer    schedule 26.09.2012
comment
в дополнение к комментарию @MadProgrammer: никогда не используйте размер setXXSize в своем коде, по некоторым причинам   -  person kleopatra    schedule 26.09.2012


Ответы (1)


Вы предполагаете, что макет панели BorderLayout, когда вы добавляете компоненты, то есть: panel.add(label,BorderLayout.NORTH);. Но вы не устанавливаете макет, и JPanel использует FlowLayout, который является его по умолчанию. Вы можете исправить это следующим образом:

JPanel panel = new JPanel(new BorderLayout());
person tenorsax    schedule 26.09.2012
comment
это совершенно логично... Я немного новичок в свинге. Вы запоминаете все значения BorderLayout по умолчанию и т. д. для каждого компонента. Это куча информации, которая меня пугает ;) - person Bernard; 26.09.2012
comment
Подождите, пока снова не измените его :P - person MadProgrammer; 26.09.2012
comment
@Bernard BorderLayout по умолчанию используется для панелей содержимого, FlowLayout — по умолчанию для JPanel. Обязательно ознакомьтесь с разделами Использование менеджеров компоновки и Наглядное руководство по менеджерам компоновки для получения дополнительной информации. - person tenorsax; 26.09.2012