我在JFrame中只有JTabbedPane。 JTabbedPane将其尺寸设置为最大页面宽度/高度。 由于页面大小不同,是否可以在选择其他页面时强制JTabbedPane更改其尺寸?
最重要的一个是它现在的行为,最重要的是我希望它如何表现(我手工调整框架)
答案 0 :(得分: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 :(得分:3)
我认为另一种选择是在选择标签时动态更改每个标签的面板:
JTabbedPane
选择pack()
JTabbedPane
免责声明:我没有测试过这种方法,但我相信它应该按照你想要的方式运行。
另请注意,从纯GUI角度来看,根据所选标签动态更改对话框的大小不是非常用户友好。
答案 2 :(得分:0)
这个怎么样?
tabbedPane.addChangeListener(new ChangeListener(){
@Override
public void stateChanged(ChangeEvent arg0) {
Component mCompo=tabbedPane.getSelectedComponent();
tabbedPane.setPreferredSize(mCompo.getPreferredSize());
BasicFrame.this.pack();
}
});