如何让我的节点在 JavaFx/FXML 的 运行 时间内自动调整其内容?
How to make my nodes auto adjusting its contents during the run time in JavaFx/FXML?
nodes
在第一次加载 FXML 时自动调整大小,但是当我在 运行 期间更改 label
中的文本时它保持不变。
最小、完整且可验证的示例
主要Class:
public class Main extends Application {
private Stage stage;
private StackPane stackPane;
@Override
public void start(Stage primaryStage) throws Exception{
stage = primaryStage;
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
Parent root = (Parent) loader.load();
stackPane = new StackPane(root);
Scene scene = new Scene(stackPane);
scene.setFill(Color.WHITE);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
控制器Class:
public class Controller implements Initializable{
@FXML private Label label1;
@FXML private Button changeLabel;
private StringProperty labelString = new SimpleStringProperty();
@Override
public void initialize(URL location, ResourceBundle resources) {
labelString.setValue("aasdasd sad asdasd asdasda");
label1.textProperty().bind(labelString);
}
@FXML
public void clicked(MouseEvent e){
labelString.setValue("asdsadasd asdasdasd sfdgsfwoef fgtrhfgbdrgdf dfgdfivbjkfd gdfgidfjvdf gdfgjldkvbdf gjdilgjdfv dfgojdflkgdf ");
}
}
sample.fxml:
<GridPane fx:controller="sample.Controller"
xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10" maxHeight="Infinity">
<children>
<VBox fx:id="body"
alignment="CENTER"
maxHeight="Infinity"
GridPane.vgrow="SOMETIMES"
prefWidth="300"
GridPane.columnIndex="0"
GridPane.rowIndex="1" spacing="5">
<Label alignment="CENTER" VBox.vgrow="ALWAYS" wrapText="true" textAlignment="CENTER" fx:id="label1" maxWidth="268"/>
<Button fx:id="changeLabel" text="Change" minWidth="50" onMouseClicked="#clicked" maxWidth="Infinity" />
</VBox>
</children>
</GridPane>
期望:
当我按下 'Change' 按钮时,一切都应该调整大小以提供足够的 space 来显示文本。
问题:
当我按下 'Change' 按钮时,UI 保持不变,不显示全文。
自动调整取决于您使用的布局窗格。我建议你看看一些文档,e。 G。 Using Built-in Layout Panes.
对于你的情况,你想调整舞台的大小。没有人可能猜到你到底想要什么。你想让它改变宽度或高度以满足你的要求吗?
但是,这里有一个针对您的案例的示例解决方案。
将此添加到控制器:
public StringProperty getStringProperty() {
return labelString;
}
这是主要的 class:
Controller controller = loader.getController();
StringProperty stringproperty = controller.getStringProperty();
stringproperty.addListener( (ChangeListener<String>) (observable, oldValue, newValue) -> {
stage.setHeight(400); // TODO: calculate width/height depending on what your requirements are
});
或者,您可以将舞台交给控制器。正如我所说,这只是许多可能解决方案的一个例子。你需要更具体。
nodes
在第一次加载 FXML 时自动调整大小,但是当我在 运行 期间更改 label
中的文本时它保持不变。
最小、完整且可验证的示例
主要Class:
public class Main extends Application {
private Stage stage;
private StackPane stackPane;
@Override
public void start(Stage primaryStage) throws Exception{
stage = primaryStage;
FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
Parent root = (Parent) loader.load();
stackPane = new StackPane(root);
Scene scene = new Scene(stackPane);
scene.setFill(Color.WHITE);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
控制器Class:
public class Controller implements Initializable{
@FXML private Label label1;
@FXML private Button changeLabel;
private StringProperty labelString = new SimpleStringProperty();
@Override
public void initialize(URL location, ResourceBundle resources) {
labelString.setValue("aasdasd sad asdasd asdasda");
label1.textProperty().bind(labelString);
}
@FXML
public void clicked(MouseEvent e){
labelString.setValue("asdsadasd asdasdasd sfdgsfwoef fgtrhfgbdrgdf dfgdfivbjkfd gdfgidfjvdf gdfgjldkvbdf gjdilgjdfv dfgojdflkgdf ");
}
}
sample.fxml:
<GridPane fx:controller="sample.Controller"
xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10" maxHeight="Infinity">
<children>
<VBox fx:id="body"
alignment="CENTER"
maxHeight="Infinity"
GridPane.vgrow="SOMETIMES"
prefWidth="300"
GridPane.columnIndex="0"
GridPane.rowIndex="1" spacing="5">
<Label alignment="CENTER" VBox.vgrow="ALWAYS" wrapText="true" textAlignment="CENTER" fx:id="label1" maxWidth="268"/>
<Button fx:id="changeLabel" text="Change" minWidth="50" onMouseClicked="#clicked" maxWidth="Infinity" />
</VBox>
</children>
</GridPane>
期望: 当我按下 'Change' 按钮时,一切都应该调整大小以提供足够的 space 来显示文本。
问题: 当我按下 'Change' 按钮时,UI 保持不变,不显示全文。
自动调整取决于您使用的布局窗格。我建议你看看一些文档,e。 G。 Using Built-in Layout Panes.
对于你的情况,你想调整舞台的大小。没有人可能猜到你到底想要什么。你想让它改变宽度或高度以满足你的要求吗?
但是,这里有一个针对您的案例的示例解决方案。
将此添加到控制器:
public StringProperty getStringProperty() {
return labelString;
}
这是主要的 class:
Controller controller = loader.getController();
StringProperty stringproperty = controller.getStringProperty();
stringproperty.addListener( (ChangeListener<String>) (observable, oldValue, newValue) -> {
stage.setHeight(400); // TODO: calculate width/height depending on what your requirements are
});
或者,您可以将舞台交给控制器。正如我所说,这只是许多可能解决方案的一个例子。你需要更具体。