JavaFX的。无法删除TabPane右侧的额外空间

时间:2014-05-30 12:52:18

标签: css user-interface tabs javafx-2 tabpanel

我正在使用标签导航在JavaFX 2.2上开发全屏应用程序。标签应填充所有屏幕宽度。但是我发现我在标题区域的右侧有10px空间。而且有趣的是:这个空格只有在我切换到最后一个标签后才出现,只有在我切换到第一个标签后才会消失。其他选项卡不会更改此空间,只有在选择最后一个选项卡后才会显示,并在选择第一个选项卡后消失。这里是解释问题的截图(此边距为黄色):

enter image description here

enter image description here

标签的宽度我用简单的公式计算:

double tabWidth = tabPane.getWidth() / tabPane.getTabs().size();
tabPane.setTabMinWidth(tabWidth);
tabPane.setTabMaxWidth(tabWidth);

在CSS类中删除了所有填充。此外,我设置了特殊颜色,以了解谁是这个空间的所有者..并且看起来它是主要的标题区域。这里是CSS-calsses:

.tab-pane .headers-region {
 -fx-background-color: yellow;
 -fx-padding: 0;
 -fx-background-insets: 0;
 -fx-effect: null;
}

.tab-pane {
 -fx-background-color: white;
 -fx-background-insets:0;
 -fx-padding: 0;
}

*.tab-header-background {
 -fx-padding:0;
 -fx-background-insets:0;
}

.tab-pane *.tab-header-background {
 -fx-padding:0;
 -fx-background-insets:0;
}

.tab:selected {
 -fx-background-color: white;
 -fx-background-insets: 0;
 -fx-background-radius: 0;    
}

.tab {
 -fx-background-color: white;
 -fx-padding: 0;
 -fx-background-insets: 0;   
}

.tab:top {
 -fx-padding: 0;
 -fx-background-insets: 0;
}

.tab:right {
 -fx-padding: 0;
 -fx-background-insets: 0;
}

.tab:bottom {
 -fx-padding: 0;
 -fx-background-insets: 0;
}

.tab:left {
 -fx-padding: 0;
 -fx-background-insets: 0;
}

.tab:hover {
 -fx-padding: 0;
 -fx-background-insets: 0;
}

.tab-header-area {
 -fx-padding: 0;
 -fx-background-insets: 0;
}

.tab-pane:top *.tab-header-area {
 -fx-background-insets: 0;
 -fx-padding: 0;
}

.tab-pane:bottom *.tab-header-area {
 -fx-background-insets: 0;
 -fx-padding: 0;
}

.tab-pane:left *.tab-header-area {
 -fx-background-insets: 0;
 -fx-padding: 0;
}

.tab-pane:right *.tab-header-area {
 -fx-background-insets: 0;
 -fx-padding: 0;
}

.control-buttons-tab {
 -fx-background-insets: 0;
 -fx-background-radius: 0;
 -fx-padding: 0;
}

.tab-down-button {
 -fx-background-color: green;
 -fx-padding: 0;
}

.tab-down-button .arrow {
 -fx-background-insets: 0;
 -fx-background:black;
 -fx-width:0;
 -fx-padding: 0;
 -fx-shape: " ";
}

.arrow {
 -fx-background-insets: 0;
 -fx-background:black;
 -fx-width:0;
 -fx-padding: 0;
 -fx-shape: " ";
}

1 个答案:

答案 0 :(得分:3)

问题是TabPaneSkin类,它将Tabs转换为节点。 当他的偏移量大于他的宽度时,需要将TabHeaderArea滚动到左侧(或右侧)。 查看TabHeaderArea类中的方法scrollToSelectedTab(double selected, double previous)

我发现解决此问题的唯一方法是创建自定义MyTabPaneSkin(灵感来自TabPaneSkin)并更改方法scrollToSelectedTab的行为(因为它的所有成员都是私有的,扩展它不会是有用)。

然后,覆盖TabPane类的方法createDefaultSkin,如下所示:

TabPane tabPane = new TabPane(){
    @Override
    protected Skin<?> createDefaultSkin() {
        return new MyTabPaneSkin(this);
    }   
};

请注意,您将丢失原始TabPaneSkin的所有改进或修复。

理想情况下,JavaFX应该允许禁用自动滚动...

来实现此功能

(见https://javafx-jira.kenai.com/browse/RT-38014