gpt4 book ai didi

javafx - 如何根据需要获取滚动条并使用 TabPane 作为内容?

转载 作者:行者123 更新时间:2023-12-02 07:13:37 29 4
gpt4 key购买 nike

我在 ScrollPane 内的 Tabpane 内有一个 BorderPane。如果我删除 TabPane 并将 BorderPane 作为 ScrollPane 的内容,ScrollPane.ScrollBarPolicy.AS_NEEDED 确实可以工作。我如何让它与 TabPane 一起使用?

不知何故,BorderPane 能够告诉 ScrollPane 何时显示滚动条,而 TabPane 无法这样做。我查看了 Tabpane 的可用方法,但找不到任何用于调整大小的方法。

工作示例:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class FXApplication extends Application {

private BorderPane border;
private GridPane inner;
private TabPane tabPane;

@Override
public void start(Stage primaryStage) {

tabPane = new TabPane();
Tab tab = new Tab("test");
tabPane.getTabs().add(tab);

border = new BorderPane();
border.setCenter(innerGrid());
tab.setContent(border);

ScrollPane scp = new ScrollPane();
scp.setFitToHeight(true);
scp.setFitToWidth(true);
scp.setVbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);
scp.setHbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);

// scp.setContent(border); // this works
scp.setContent(tabPane); // this doesnt

Scene s = new Scene(scp);
primaryStage.setScene(s);
primaryStage.show();
}

private GridPane innerGrid() {
inner = new GridPane();

for(int i=0; i<11 ;i++) {
ColumnConstraints columnConstraints = new ColumnConstraints();
columnConstraints.setHgrow(Priority.SOMETIMES);
inner.getColumnConstraints().add(columnConstraints);

RowConstraints rowConstraints = new RowConstraints();
rowConstraints.setVgrow(Priority.SOMETIMES);
inner.getRowConstraints().add(rowConstraints);
}

for(int i=0; i<100 ;i++) {
inner.add(new Button("Button " + i), i/10, i%10);
}

return inner;
}

public static void main(String[] args) {
FXApplication.launch(args);
}

}

最佳答案

令人惊讶的是,AS_NEEDED 的确切行为尚未指定。我们所看到的只是 ScrollPaneSkin。是否显示(f.i.)水平条的决定发生在其私有(private)方法defineeHorizo​​ntalSBVisible()

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 是内容节点的实际宽度 - 之前已根据节点的最小/最大宽度计算 - 而 contentWidth 是可用于布局内容的宽度。

不可读的代码(对我来说;)在可调整大小的内容并适合scrollPane的内容区域的情况下,如果内容的实际宽度和最小宽度都大于可用宽度,则归结为返回true。

minWidth 在您的上下文中有所不同:BorderPane 有一个 min > 0,TabPane 有一个 min == 0,因此上面的方法始终返回 false。

相反:为了允许 hbar 在 TabPane 中可见,它需要一分钟,f.i.通过将其与其首选项相关联:

tabPane.setMinWidth(Region.USE_PREF_SIZE);

关于javafx - 如何根据需要获取滚动条并使用 TabPane 作为内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55375051/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com