如何使JTabbedPane自动resize以适应页面尺寸?

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

http://grab.by/3hIg

最重要的一个是它现在的行为,最底层的是我希望它如何表现(我手工resize)

这很简单。 它涉及动态计算页面尺寸之间的差异,并使用它们来强制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. 在选择监听器中:
    • 从先前选择的选项卡中删除面板(即,将其替换为空面板)
    • 通过新选择的选项卡中的实际面板更改空面板
    • 在包含JTabbedPane的窗口/对话框上调用pack()

免责声明 :我没有测试过这种方法,但我相信它应该按照你想要的方式工作。

另请注意,从纯GUI角度来看,基于所选选项卡动态更改对话框的大小不是非常用户友好。

这个怎么样?

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