如何使JTabbedPane自动调整大小以适合页面尺寸?

tea*_*mon 5 java swing jtabbedpane

我在JFrame中只有JTabbedPane。JTabbedPane将其尺寸设置为最大页面宽度/高度。由于页面大小不同,是否可以在选择其他页面时强制JTabbedPane更改其尺寸?

http://grab.by/3hIg

顶部是现在的行为方式,底部是我希望它的行为方式(我手动调整了尺寸)

Eug*_*kov 4

这相当简单。它涉及动态计算页面尺寸之间的差异,并使用它们来强制您选择首选尺寸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;

    }

}
Run Code Online (Sandbox Code Playgroud)