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

Java 如何使JTabbedPane自动调整大小以适应页面尺寸?,java,swing,jtabbedpane,Java,Swing,Jtabbedpane,JFrame中只有JTabbedPane。JTabbedPane将其尺寸设置为最大页面宽度/高度。 由于页面大小不同,在选择其他页面时是否可以强制JTabbedPane更改其维度 上一个是它现在的行为,下一个是我希望它的行为(我手动调整了框架的大小)这相当简单。它涉及到动态计算页面维度之间的差异,并使用它们强制您使用首选大小JTabbedPane。我做了一个快速的实验,结果成功了。因此,不要在这里放太多的文本,这里是代码。这并不完美,但你应该有个想法。当然,欢迎提问 import java.a

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


上一个是它现在的行为,下一个是我希望它的行为(我手动调整了框架的大小)

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

    }

}

我认为另一种选择是在选择选项卡时动态更改每个选项卡的面板:

  • JTabbedPane
    选择中安装侦听器
  • 默认情况下,在每个选项卡上安装一个空面板,但所选选项卡除外(包含该选项卡的真实面板)
  • 在选择侦听器中:
    • 从以前选择的选项卡中删除面板(即,将其替换为空面板)
    • 在新选择的选项卡中,通过真实面板更改空面板
    • 在包含
      JTabbedPane
  • 免责声明:我还没有测试过这种方法,但我相信它应该根据您的需要工作

    还请注意,从纯GUI的角度来看,根据所选选项卡动态更改对话框的大小对用户不是很友好。

    这如何

    tabbedPane.addChangeListener(new ChangeListener(){
    
        @Override
        public void stateChanged(ChangeEvent arg0) {
            Component mCompo=tabbedPane.getSelectedComponent();
            tabbedPane.setPreferredSize(mCompo.getPreferredSize());
            BasicFrame.this.pack();
        }   
    });
    

    好的,这很好(即使使用scala swing),但是不将面板宽度和高度设置为其内容的首选大小,是否可以做到这一点。您可以使用单独的内容页(嵌入了选项卡式窗格)并为其设置首选维度,而不是选项卡式窗格本身,但您必须将其设置为某个值。这实际上很有效,并且比eugener的上述代码要好。Eugen的代码以一个太大的窗口开始-它有蓝色选项卡的尺寸,尽管蓝色选项卡不可见,但红色选项卡可见。@xmjx如果可以的话,你能把它放在一个新的答案中吗?我很难从上面模糊的说明中看出如何做到这一点。