JavaFX。控制器之间的通信
你好,我从JavaFX开始,我遇到了一些问题。 我想从两个不同的角度传达两种控制。我怎么做? 我正在使用选项卡,我有两个控制器,我想做类似的事情: Application.java:JavaFX。控制器之间的通信,javafx,tabs,Javafx,Tabs,你好,我从JavaFX开始,我遇到了一些问题。 我想从两个不同的角度传达两种控制。我怎么做? 我正在使用选项卡,我有两个控制器,我想做类似的事情: Application.java: public class JavaFXApplication6 extends Application { @Override public void start(Stage primaryStage) { try { Parent root = FXMLLoader.loa
public class JavaFXApplication6 extends Application
{
@Override
public void start(Stage primaryStage)
{
try
{
Parent root = FXMLLoader.load(getClass().getResource(
"/view/FXML_Main.fxml"));
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e){
e.printStackTrace();
}
primaryStage.setTitle("Back-end GUI");
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
launch(args);
}
}
FXML_Main.FXML:
FXML_Tab1.FXML:
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0"
xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="controller.FXML_Tab1Controller">
<children>
<Label fx:id="Label1" layoutX="282.0" layoutY="108.0" text="Label" />
<TextField fx:id="FextField1" layoutX="215.0" layoutY="146.0" />
<Button fx:id="Button1" layoutX="269.0" layoutY="197.0" mnemonicParsing="false"
onAction="#actionButton1" text="Button" />
</children>
</AnchorPane>
FXML_Tab2.FXML:
类似的视频:
向每个
标签添加fx:id
:
<tabs>
<Tab text="Untitled Tab 1">
<content>
<fx:include source="FXML_Tab1.fxml" fx:id="tab1" />
</content>
</Tab>
<Tab text="Untitled Tab 2">
<content>
<fx:include source="FXML_Tab2.fxml" fx:id="tab2" />
</content>
</Tab>
</tabs>
变量命名在这里非常重要:字段必须命名为xController
,其中x
是fx:include
中fx:id
属性的值。有关详细信息,请参阅
现在,在主控制器的initialize()
方法中,可以建立两个控制器之间的关系:
public class FXML_MainController {
@FXML
private FXML_Tab1Controller tab1Controller ;
@FXML
private FXML_Tab2Controller tab2Controller ;
public void initialize() {
tab1Controller.tab2Controller = tab2Controller ;
tab2Controller.tab1Controller = tab1Controller ;
}
}
将
fx:id
添加到每个
标记:
<tabs>
<Tab text="Untitled Tab 1">
<content>
<fx:include source="FXML_Tab1.fxml" fx:id="tab1" />
</content>
</Tab>
<Tab text="Untitled Tab 2">
<content>
<fx:include source="FXML_Tab2.fxml" fx:id="tab2" />
</content>
</Tab>
</tabs>
变量命名在这里非常重要:字段必须命名为xController
,其中x
是fx:include
中fx:id
属性的值。有关详细信息,请参阅
现在,在主控制器的initialize()
方法中,可以建立两个控制器之间的关系:
public class FXML_MainController {
@FXML
private FXML_Tab1Controller tab1Controller ;
@FXML
private FXML_Tab2Controller tab2Controller ;
public void initialize() {
tab1Controller.tab2Controller = tab2Controller ;
tab2Controller.tab1Controller = tab1Controller ;
}
}
作为评论,我并不建议像这样共享控制器:您应该使用JavaFXObservable属性将数据封装在数据模型中,并在两个控制器之间共享数据模型。这在控制器之间提供了更好的解耦。作为评论,我并不建议像这样共享控制器:应该使用JavaFX observable属性将数据封装在数据模型中,并在两个控制器之间共享数据模型。这在控制器之间提供了更好的解耦。
public class FXML_Tab2Controller implements Initializable {
FXML_Tab1Controller tab1controller;
@FXML public Label Label2;
@FXML public TextField TextField2;
@FXML public Button Button2;
/**
* Initializes the controller class.
*/
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
@FXML private void actionButton2(ActionEvent event){
Label2.setText(tab1controller.TextField1.getText());
}
}
<tabs>
<Tab text="Untitled Tab 1">
<content>
<fx:include source="FXML_Tab1.fxml" fx:id="tab1" />
</content>
</Tab>
<Tab text="Untitled Tab 2">
<content>
<fx:include source="FXML_Tab2.fxml" fx:id="tab2" />
</content>
</Tab>
</tabs>
public class FXML_MainController {
@FXML
private FXML_Tab1Controller tab1Controller ;
@FXML
private FXML_Tab2Controller tab2Controller ;
}
public class FXML_MainController {
@FXML
private FXML_Tab1Controller tab1Controller ;
@FXML
private FXML_Tab2Controller tab2Controller ;
public void initialize() {
tab1Controller.tab2Controller = tab2Controller ;
tab2Controller.tab1Controller = tab1Controller ;
}
}