Java JTabbedPane和固定高度内容的大小问题

Java JTabbedPane和固定高度内容的大小问题,java,swing,jtabbedpane,preferredsize,Java,Swing,Jtabbedpane,Preferredsize,在写这个问题的时候,我已经找到了一种方法让它按照我想要的方式运行。基于,我仍在发布此问题,因为其他人可能会面临类似问题。 对于用于水平延伸但具有固定高度的内容的JTabbedPane的大小,我有以下问题。setTabLayoutPolicy()的两个选项似乎都会改变内容的高度,并且不会始终以首选或最小高度显示内容 使用默认的WRAP_TAB_布局,选项卡窗格的首选大小不考虑当前选项卡是否实际堆叠或相邻显示,如前所述,以及中所述。如果选项卡式窗格基于堆叠的选项卡进行布局,则当有足够的空间使选项卡彼

在写这个问题的时候,我已经找到了一种方法让它按照我想要的方式运行。基于,我仍在发布此问题,因为其他人可能会面临类似问题。

对于用于水平延伸但具有固定高度的内容的JTabbedPane的大小,我有以下问题。
setTabLayoutPolicy()
的两个选项似乎都会改变内容的高度,并且不会始终以首选或最小高度显示内容

使用默认的
WRAP_TAB_布局
,选项卡窗格的首选大小不考虑当前选项卡是否实际堆叠或相邻显示,如前所述,以及中所述。如果选项卡式窗格基于堆叠的选项卡进行布局,则当有足够的空间使选项卡彼此相邻显示时,添加的每个选项卡的内容高度将增加约20像素(一个选项卡的高度)。如果选项卡式窗格的布局基于相邻显示的选项卡,则当必须堆叠选项卡时,内容高度会降低

当策略设置为“滚动”选项卡布局时,选项卡栏的高度是固定的,布局基本正确。但是,根据外观,选项卡内容的大小会减少几个像素。我已经发现这是由于L&F定义的选项卡区域的插入导致的,这些插入未被考虑到选项卡窗格的首选大小计算中(请参阅)。设置
UIManager.getDefaults().put(“TabbedPane.tabAreaInsets”,新的插图(0,0,0,0))
适用于某些L&F(如金属),但不适用于其他L&F(如Nimbus)

似乎只有以下几种选择:

  • 使用堆叠选项卡,并将额外高度添加到内容中
  • 使用堆叠的选项卡,并在空间不足时覆盖内容
  • 使用滚动标签,并在标签内容的最小/首选大小上添加几个像素,使每个L&F看起来有点不同(但至少不应切断内容)
  • 使用滚动的选项卡并将选项卡式窗格的UI设置为新的
    BasicTabbedPaneUI
    ,看起来不太好
是否有一种干净的方法来强制选项卡式窗格的内容始终以固定的高度显示?

下面的代码和屏幕截图说明了这个问题

导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Component;
导入java.awt.Dimension;
导入java.awt.event.ComponentAdapter;
导入java.awt.event.ComponentEvent;
导入javax.swing.JFrame;
导入javax.swing.JLabel;
导入javax.swing.JPanel;
导入javax.swing.JTabbedPane;
导入javax.swing.UIManager;
公共类TabbedPaneTest扩展了JFrame{
TabbedPaneTest(){
JPanel mainPanel=新的JPanel();
主面板。立根背景(颜色。白色);
JTabbedPane tabs=新的JTabbedPane();
//tabs.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);//内容被几个像素截断
tabs.setTabPlacement(JTabbedPane.BOTTOM);
最小尺寸=新尺寸(100200);
最大尺寸=新尺寸(短最大值,短最大值);
//Dimension pref=新维度(Short.MAX_VALUE,200);//内容小时被切断
Dimension pref=新维度(0200);//内容较大时会获得额外空间
int-tabCount=3;
for(int i=0;i”;
}
公共静态void main(字符串参数[]){
/*设置Nimbus的外观和感觉*/
//
/*如果Nimbus(在JavaSE6中引入)不可用,请使用默认的外观。
*详情请参阅http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
试一试{
for(javax.swing.UIManager.LookAndFeelInfo:javax.swing.UIManager.getInstalledLookAndFeels()){
if(“Nimbus”.equals(info.getName())){
javax.swing.UIManager.setLoo