JavaFX中通过prefHeight动态修改Pane高度无效问题求助
JavaFX动态修改Pane的prefHeight不生效的解决方案
我之前做JavaFX项目时也碰到过一模一样的问题,折腾了好一阵才找到根源——问题出在你FXML里给Pane设置的maxHeight="-Infinity"属性上!
问题原因解析
在JavaFX的FXML语法中,maxHeight="-Infinity"这个设置其实是个“隐藏陷阱”:它相当于告诉布局系统,这个节点的最大高度固定为初始的prefHeight值(也就是你设置的300.0)。所以哪怕你在Controller里把prefHeight改成700,Pane的实际高度也会被maxHeight死死限制在300,自然看不到变化。而背景颜色、按钮透明度这类和布局限制无关的属性,就会正常生效。
具体解决方法
你可以从两种方案里选一种:
方案1:修改FXML中的Pane属性
直接删掉maxHeight="-Infinity",或者把它替换成JavaFX的最大高度值1.7976931348623157E308,这样Pane就没有高度上限了,能完全跟随prefHeight变化:
<Pane fx:id="loginPane" maxHeight="1.7976931348623157E308" maxWidth="-Infinity" minWidth="-Infinity" prefHeight="300.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller"> <children> <Button fx:id="login" layoutX="250.0" layoutY="37.0" mnemonicParsing="false" onMouseClicked="#clickManager" text="login" /> </children> </Pane>
方案2:在Controller中动态解除限制
如果不想改动FXML,可以在点击事件里先重置maxHeight,再修改prefHeight:
@FXML public void clickManager() { login.setOpacity(0); // 先解除最大高度的限制 loginPane.setMaxHeight(Double.MAX_VALUE); loginPane.setPrefHeight(700); loginPane.setStyle("-fx-background-color: black"); // 让Stage自动适应新的Pane尺寸(可选但建议添加,避免看不到变化) Stage stage = (Stage) loginPane.getScene().getWindow(); stage.sizeToScene(); }
额外提醒
修改完Pane高度后,一定要让Stage自动适配新尺寸——不然可能Pane高度已经变了,但Stage还是原来的大小,导致你看不到变化。上面代码里的stage.sizeToScene()就是干这个的,它会让Stage自动调整到Scene的最佳显示大小。
内容的提问来源于stack exchange,提问作者ivaylo
相关产品推荐
相关产品推荐

