JavaFX 包含 FXML 更改上层控制器
JavaFXML include FXML change upper controller
我有一个小问题。
我有一个 Menu.FXML,它有一个控制器 (MenuController)。
在 Menu.FXML 中,我包含另一个 .FXMl (Inner.FXML),它包含一个标签。
Inner.FXML 有一个 MouseClick 事件处理程序,所以当我单击 Inner.FXML 时它会执行某些操作,我希望我的 Inner.FXML 鼠标侦听器更改 Menu.FXML 内的文本。
我怎样才能做到这一点?
非常感谢。
[代码]
public class Main extends Application{
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("Menu.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
}
内部控制器:
public class InnerController implements Initializable {
public void buttonClick(ActionEvent event){
System.out.println("change label!");
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
菜单 FXML:
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="nestedcontroller.MenuController">
<children>
<Label text="Label" />
<fx:include source="Inner.fxml" />
</children>
</VBox>
InnerFXML.
<Pane fx:id="pane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: green;" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="nestedcontroller.InnerController">
<children>
<Button layoutX="271.0" layoutY="187.0" mnemonicParsing="false" onAction="#buttonClick" text="Button" />
</children>
</Pane>
在 InnerContoller
中创建和观察字符串 属性 并从按钮的处理程序中设置它。然后从外部控制器观察属性。
public class InnerController {
private final ReadOnlyStringWrapper text = new ReadOnlyStringWrapper();
public ReadOnlyStringProperty textProperty() {
return text.getReadOnlyProperty() ;
}
public String getText() {
return text.get();
}
public void buttonClick(ActionEvent event){
System.out.println("change label!");
text.set("Hello world");
}
public void initialize() {
}
}
然后将 fx:id
添加到您的 fx:include
:
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="nestedcontroller.MenuController">
<children>
<Label text="Label" fx:id="label" />
<fx:include source="Inner.fxml" fx:id="innerPane" />
</children>
</VBox>
然后在 MenuController
中观察 属性:
public class MenuController {
@FXML
private Label label ;
@FXML
private InnerController innerPaneController ;
public void initialize() {
innerPaneController.textProperty().addListener((obs, oldText, newText) ->
label.setText(newText));
// or just label.textProperty().bind(innerPaneController.textProperty());
}
}
我有一个小问题。 我有一个 Menu.FXML,它有一个控制器 (MenuController)。 在 Menu.FXML 中,我包含另一个 .FXMl (Inner.FXML),它包含一个标签。 Inner.FXML 有一个 MouseClick 事件处理程序,所以当我单击 Inner.FXML 时它会执行某些操作,我希望我的 Inner.FXML 鼠标侦听器更改 Menu.FXML 内的文本。 我怎样才能做到这一点? 非常感谢。
[代码]
public class Main extends Application{
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("Menu.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
}
内部控制器:
public class InnerController implements Initializable {
public void buttonClick(ActionEvent event){
System.out.println("change label!");
}
@Override
public void initialize(URL url, ResourceBundle rb) {
}
}
菜单 FXML:
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="nestedcontroller.MenuController">
<children>
<Label text="Label" />
<fx:include source="Inner.fxml" />
</children>
</VBox>
InnerFXML.
<Pane fx:id="pane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: green;" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="nestedcontroller.InnerController">
<children>
<Button layoutX="271.0" layoutY="187.0" mnemonicParsing="false" onAction="#buttonClick" text="Button" />
</children>
</Pane>
在 InnerContoller
中创建和观察字符串 属性 并从按钮的处理程序中设置它。然后从外部控制器观察属性。
public class InnerController {
private final ReadOnlyStringWrapper text = new ReadOnlyStringWrapper();
public ReadOnlyStringProperty textProperty() {
return text.getReadOnlyProperty() ;
}
public String getText() {
return text.get();
}
public void buttonClick(ActionEvent event){
System.out.println("change label!");
text.set("Hello world");
}
public void initialize() {
}
}
然后将 fx:id
添加到您的 fx:include
:
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="nestedcontroller.MenuController">
<children>
<Label text="Label" fx:id="label" />
<fx:include source="Inner.fxml" fx:id="innerPane" />
</children>
</VBox>
然后在 MenuController
中观察 属性:
public class MenuController {
@FXML
private Label label ;
@FXML
private InnerController innerPaneController ;
public void initialize() {
innerPaneController.textProperty().addListener((obs, oldText, newText) ->
label.setText(newText));
// or just label.textProperty().bind(innerPaneController.textProperty());
}
}