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
相关产品推荐
相关产品推荐

