[英](JavaFX) How to pass instance of class to an FXML controller without knowing that controller's name?
[英]How to work with FXML (pass or get values from interface) without using controller class in JavaFX?
是否可以在不使用控制器類的情況下從JavaFX中的FXML接口字段傳遞/獲取值?
不,不是真的。
JavaFX遵循MVC類型的體系結構。 該模型留給程序員(在JavaFX可觀察屬性的支持下):FXML支持視圖,Java控制器是Controller。
這樣就可以很好地區分布局的定義(視圖,在fxml中)和處理邏輯(在Java中的控制器),它遵循長期建立的,經過驗證的行業標准設計。 它還使FXML保持簡潔,這使得創建快速應用程序開發(RAD)工具(如SceneBuilder)變得相對容易。
也就是說,(至少在技術上)支持FXML中的腳本,雖然我不知道任何實際使用它(甚至,任何真實的例子)。 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.*?>
<?language javascript?>
<VBox xmlns:fx="http://javafx.com/fxml/1">
<children>
<TextField promptText="Enter a number" fx:id="x" />
<TextField promptText="Enter another number" fx:id="y" />
<Button text="Calculate" onAction="sum.text=parseInt(x.text)+parseInt(y.text)"/>
<Label fx:id="sum" />
</children>
</VBox>
如果您可以想出做一些簡單的事情,例如避免“計算”按鈕,只需在文本字段中的文本更改時更新標簽,請隨時發布。 我並不認為這是一種適用於任何實際應用的技術。
如果使用fx:root為fxml創建自定義根,則可以使用不同的模式,這樣“控制器”也將成為組件的一部分,就像模式Code Behind一樣。
基本上,您擴展了JavaFX的一個組件(例如BorderPane)。 然后你用它作為你的FXML的根。 要完成這項工作,你必須使用FXMLLoader的setRoot(...)方法並在FXML中使用fx:root。
然后,您也可以將自定義JavaFX組件用作控制器,並在構造函數中調用FXMLLoader。 因此,您可以在自定義Java組件中注入FXML中的組件:
public class MyJavaFXBorderPane extends BorderPane {
@FXML
public TextField textFieldFromFXML;
public MyJavaFXBorderPane() {
final FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("myfxml.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
}
}
您可以使用以下技術更改加載順序:首先是Java組件(也是控制器),然后使用FXMLLoader然后是控制器,先使用FXML而不是FXML。
所以,當然它是一個控制器,但也是一個組件,它是fxml的根,你可以覆蓋方法,添加新的字段等...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.