簡體   English   中英

如何在不使用JavaFX中的控制器類的情況下使用FXML(從接口傳遞或獲取值)?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM