Как сделать, чтобы JTabbedPane автоматически изменял размер в соответствии с размерами страницы?

У меня есть только JTabbedPane внутри JFrame. JTabbedPane устанавливает его размеры на наибольшую ширину / высоту страницы. Поскольку страницы имеют разный размер, можно ли заставить JTabbedPane изменять свои размеры при выборе другой страницы?

http://grab.by/3hIg

Верхняя часть - это то, как она ведет себя сейчас, а нижняя - то, как я хочу, чтобы она себя вел (я изменил размер кадра вручную).

3 ответа

Это довольно просто. Он включает в себя динамический расчет различий между размерами ваших страниц и их использование, чтобы навязать вам предпочтительный размер JTabbedPane, Я сделал быстрый эксперимент, и это сработало. Так что вместо того, чтобы помещать много текста здесь - вот код. Это не идеально, но вы должны понять. Вопросы приветствуются, конечно.

import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Test {

    private static int maxW = 0;
    private static int maxH = 0;

    public static void main(String[] args) {


        final JFrame f = new JFrame();

        final JTabbedPane tabs = new JTabbedPane();

        tabs.add( createPanel(Color.RED, 100, 100), "Red");
        tabs.add( createPanel(Color.GREEN, 200, 200), "Green");
        tabs.add( createPanel(Color.BLUE, 300, 300), "Blue");

        final Dimension originalTabsDim = tabs.getPreferredSize();

        tabs.addChangeListener(new ChangeListener() {

            @Override
            public void stateChanged(ChangeEvent e) {

                Component p =   ((JTabbedPane) e.getSource()).getSelectedComponent();
                Dimension panelDim = p.getPreferredSize();

                Dimension nd = new Dimension(
                        originalTabsDim.width - ( maxW - panelDim.width),
                        originalTabsDim.height - ( maxH - panelDim.height) );

                tabs.setPreferredSize(nd);

                f.pack();
            }

        });

        f.setContentPane(tabs);
        f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        f.pack();
        f.setLocationRelativeTo(null);

        f.setVisible(true);


    }

    private static final JPanel createPanel( Color color, int w, int h ) {

        JPanel p = new JPanel();
        p.setBackground(color);
        p.setPreferredSize( new Dimension(w, h));

        maxW = Math.max(w, maxW);
        maxH = Math.max(h, maxH);

        return p;

    }

}

Я думаю, что другой вариант - динамически менять панели каждой вкладки, когда вкладка выбрана:

  1. установить слушатель на JTabbedPane выбор
  2. установить пустую панель на каждой вкладке, но на выбранной вкладке по умолчанию (которая содержит реальную панель для этой вкладки)
  3. в выборе слушателя:
    • удалить панель из ранее выбранной вкладки (т.е. заменить ее пустой панелью)
    • заменить пустую панель реальной панелью во вновь выбранной вкладке
    • вызов pack() в окне / диалоге, содержащем JTabbedPane

Отказ от ответственности: я не проверял этот подход, но я считаю, что он должен работать в соответствии с тем, что вы хотите.

Также обратите внимание, что динамическое изменение размера диалога на основе выбранной вкладки не очень удобно для пользователя с точки зрения чистого графического интерфейса.

Как насчет этого?

tabbedPane.addChangeListener(new ChangeListener(){

    @Override
    public void stateChanged(ChangeEvent arg0) {
        Component mCompo=tabbedPane.getSelectedComponent();
        tabbedPane.setPreferredSize(mCompo.getPreferredSize());
        BasicFrame.this.pack();
    }   
});
Другие вопросы по тегам