You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX ScrollPane设置Vvalue不生效的特定场景问题

JavaFX ScrollPane设置Vvalue无视觉变化的问题

触发条件

  • 在Button的点击事件中修改ScrollPane的vvalue属性
  • 同时在该事件处理逻辑内禁用此Button
  • ScrollPane包含较复杂的内容(后续验证发现内容数量不影响此问题)

问题现象

启动应用后点击按钮,ScrollPane并未按设置的vvalue滚动;但如果移除禁用按钮的代码,ScrollPane能正常滚动到指定位置。

最小复现代码

public class Main extends Application {

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

    @Override
    public void start(Stage primaryStage) {
        System.out.println(System.getProperty("javafx.runtime.version"));
        var showButton = new Button("CLICK ME");

        var sp = new ScrollPane();

        var vbox = new VBox();
        var vbox2 = new VBox();

        for (int i = 0; i < 200; i++) {
            vbox2.getChildren().addAll(
                    new Label("dummy"),
                    new HBox(new HBox()),
                    new GridPane(),
                    new Button("dummy"));
        }

        showButton.setOnAction(event -> {
            sp.setVvalue(0.5);
            // 同时禁用按钮时,ScrollPane的Vvalue不会被渲染
            // 上方的复杂内容已足够复现,若不行可将循环次数从200调至1000或更多
            showButton.setDisable(true);
        });

        vbox.setPadding(new Insets(50,50,50,50));
        vbox.setSpacing(50);

        vbox.getChildren().addAll(showButton, vbox2);

        sp.setContent(vbox);

        var scene = new Scene(sp);
        primaryStage.setWidth(150);
        primaryStage.setHeight(150);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

临时(不合理)解决方案

将设置vvalue的代码放到带延迟的新线程中可临时解决,但该方案并不合理:

...
new Thread(() -> {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
    sp.setVvalue(0.5);
}).start();
showButton.setDisable(true);
...

环境信息

  • Kubuntu 23.04(Linux)
  • JavaFX 17.0.8+1+b01

内容的提问来源于stack exchange,提问作者MarekChr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 09:07:27