Удивительно, но точное поведение AS_NEEDED не указано.Все, что у нас есть, это ScrollPaneSkin, чтобы посмотретьРешение о том, показывать или нет горизонтальную полосу (fi), происходит в ее частном методе determineHorizontalSBVisible()
private boolean determineHorizontalSBVisible() {
final ScrollPane sp = getSkinnable();
if (Properties.IS_TOUCH_SUPPORTED) {
return (tempVisibility && (nodeWidth > contentWidth));
}
else {
// RT-17395: ScrollBarPolicy might be null. If so, treat it as "AS_NEEDED", which is the default
ScrollBarPolicy hbarPolicy = sp.getHbarPolicy();
return (ScrollBarPolicy.NEVER == hbarPolicy) ? false :
((ScrollBarPolicy.ALWAYS == hbarPolicy) ? true :
((sp.isFitToWidth() && scrollNode != null ? scrollNode.isResizable() : false) ?
(nodeWidth > contentWidth && scrollNode.minWidth(-1) > contentWidth) : (nodeWidth > contentWidth)));
}
}
Здесь nodeWidth - это фактическая ширина узла контента - был вычислен ранее с учетом минимума узла/ max widths - и contentWidth - это ширина, доступная для размещения контента.
Нечитаемый код (для меня;) В случае изменяемого размера контента и встраивания в область содержимого scrollPane сводится к возврату true, если оба содержимого актуальныи min ширина больше доступной ширины.
minWidth имеет значение в вашем контексте: BorderPane имеет min > 0
, TabPane имеет min == 0
, поэтому приведенный выше метод всегда возвращает false.
С другой стороны: чтобы позволить hbar быть видимым с TabPane, ему нужно min, fi, связав его с префом:
tabPane.setMinWidth(Region.USE_PREF_SIZE);