JTabbedPane в JPanel?

У меня есть простая проблема, когда я хочу добавить вкладки в свою jpanel. Выравнивание вкладок становится горизонтальным, а не вертикальным, что выглядит как дерьмо =/.

Это выглядит так:

введите здесь описание изображения

Если вместо этого я откажусь от панели и добавлю tabbedPane непосредственно в фрейм, все будет работать нормально. Если вы раскомментируете три строки кода и удалите getContentPane().add(jtp);, вы сможете воспроизвести мою проблему.

рабочий Код:

public class TabbedPane extends JFrame
{
    public TabbedPane()
    {
        setTitle("Tabbed Pane");
        setSize(300, 300); // set size so the user can "see" it
        JTabbedPane jtp = new JTabbedPane();

        // JPanel panel = new JPanel();//uncomment all three lines
        // panel.add(jtp);
        // getContentPane().add(panel);

        getContentPane().add(jtp);//remove me

        JPanel jp1 = new JPanel();// This will create the first tab
        JPanel jp2 = new JPanel();// This will create the second tab

        JLabel label1 = new JLabel();
        label1.setText("This is Tab 1");
        jp1.add(label1);

        jtp.addTab("Tab1", jp1);
        jtp.addTab("Tab2", jp2);

        JButton test = new JButton("Press");
        jp2.add(test);

        setVisible(true); // otherwise you won't "see" it
    }

    public static void main(String[] args)
    {
        TabbedPane tab = new TabbedPane();
    }

}

Большое спасибо!


person Thkru    schedule 27.01.2013    source источник
comment
Я думаю, вам просто нужно установить размер: stackoverflow.com/questions/2510310/   -  person James    schedule 28.01.2013


Ответы (5)


Если вместо этого я откажусь от панели и добавлю tabbedPane непосредственно в кадр, все будет работать нормально.

Макет JPanel по умолчанию — FlowLayout, что «позволяет каждому компоненту принимать свой естественный (предпочтительный) размер». Макет JFrame по умолчанию — BorderLayout, CENTER которого игнорирует предпочтительный размер. В любом случае вызов setSize() изначально предотвращает функционирование макета; измените размер кадра, чтобы увидеть эффект. Вместо этого используйте pack(), что «приводит к тому, что размер этого Window соответствует предпочтительному размеру и расположению его подкомпонентов».

setDefaultCloseOperation(EXIT_ON_CLOSE);
pack();
setVisible(true); // otherwise you won't "see" it
person trashgod    schedule 28.01.2013
comment
Насколько я могу следовать за вами, вы правы. Но в любом случае я не вижу связи, как это решает мою проблему. +1 в любом случае ;) - person Thkru; 28.01.2013
comment
@ThomasK: менеджеры компоновки предназначены для размещения компонентов разного размера в ответ на изменение размера окружающего окна; pack() выполняет первоначальную настройку. Возможно, вам придется немного поэкспериментировать, чтобы увидеть эффект; больше здесь и здесь. - person trashgod; 28.01.2013

Я бы многое изменил в этом коде, начиная с рекомендаций @trashgod. OTOH это минимальное изменение, необходимое для того, чтобы растянуть панель с вкладками до ширины/высоты родительского контейнера.

// give the panel a layout that will stretch components to available space
JPanel panel = new JPanel(new GridLayout());//uncomment all three lines
panel.add(jtp);
getContentPane().add(panel);

//getContentPane().add(jtp);//remove me

Дополнительные сведения см. в этом ответе.

person Andrew Thompson    schedule 28.01.2013

Ну, во-первых, вы можете попробовать это:

    JPanel panel = new JPanel();//uncomment all three lines
    panel.setLayout(new GridLayout());
    JPanel jp1 = new JPanel();// This will create the first tab
    JPanel jp2 = new JPanel();// This will create the second tab

    JLabel label1 = new JLabel();
    label1.setText("This is Tab 1");
    jp1.add(label1);

    jtp.addTab("Tab1", jp1);
    jtp.addTab("Tab2", jp2);

    JButton test = new JButton("Press");
    jp2.add(test);
    getContentPane().add(jtp);

и в основном:

    TabbedPane tab = new TabbedPane();
    tab.pack();
    tab.setVisible(true);

Могу ли я предложить использовать MigLayout для установки макетов, это сделает вашу жизнь проще. Надеюсь, поможет.

person Ivo    schedule 27.01.2013

Попробуйте GridbagLayout. После того, как вы освоите его, вы сможете создавать пользовательский интерфейс любого типа с помощью этого макета.

person prasanth    schedule 28.01.2013
comment
Как только вы освоите его, .. Вы мастер GBL? вы можете создать любой пользовательский интерфейс Правда? Вот вам задание: спроектируйте графический интерфейс с таким же макетом, как показано в примере вложенного макета, используя только ГБЛ. Не беспокойтесь о границах заголовков, а воспроизведите эффект остального графического интерфейса. - person Andrew Thompson; 29.01.2013

Я согласен с прасантом относительно использования GridBagLayout

Однажды я столкнулся с этой проблемой и решил ее, добавив JTabbedPane на панель через GridBagLayout, убедитесь, что вы добавили JTabbedPane с помощью ipadx и ipady в соответствии с вашими требованиями в объекте GridBagConstraints, например.

JPanel myPanel=new JPanel();
myPanel.setLayout(new GridBagLayout());
JTabbedPane jTP=new JTabbedPane();
jTP.add("Tab1",new JPanel());//substitute your component instead of "new JPanel"
GridBagConstraints myConstraints=new GridBagConstraints();
myConstraints.ipadx=400;//streches the component being added along x axis - 200 px on both sides
myConstraints.ipady=600;//streches the component being added along y axis - 200 px on both sides
myPanel.add(jTP,myConstraints);

Вы можете настроить оба этих свойства в соответствии с тем, что идеально подходит для ваших нужд.

person Romantic Electron    schedule 03.09.2013