簡體   English   中英

使用 JavaFX 打開多個窗口

[英]Opening multiple windows with JavaFX

我正在嘗試使用 JavaFX 打開多個窗口,我有一個事件監聽器,當單擊按鈕時會打開一個新窗口,如下所示:

@FXML
private void joinAction() {
    Parent root;
    try {
        Stage stage = (Stage) joinButton.getScene().getWindow();
        stage.close();

        root = FXMLLoader.load(getClass().getResource("main.fxml"));
        stage = new Stage();
        stage.setTitle("TuneUs");
        stage.setScene(new Scene(root));
        stage.show();

    } catch (IOException e) {e.printStackTrace();}
}

第一個窗口打開,新窗口打開,但我的問題是讓事件與我的第二個窗口一起工作

main.fxml我有這一行:

<TextField id="chat_bar" onAction="#sendChat" layoutX="14.0" layoutY="106.0" prefHeight="22.0" prefWidth="403.0"/>

然后在我的控制器類中,我有這個方法:

@FXML
private void sendChat() {
    System.out.println("test");
}

但 Intellij 告訴我; 沒有為頂級元素指定控制器

所以,我的問題是:我是否需要創建多個控制器類,或者如果可以的話,我可以只為多個窗口使用一個嗎?

建議的方法是為每個FXML定義一個控制器。 由於控制器非常輕巧,因此不應增加太多開銷。 main.fxml文件的控制器可能很簡單

import javafx.fxml.FXML ;

public class MainController {
  @FXML
  private void sendChat() {
    // ...
  }
}

我在單個項目中使用了相當大量的FXML文件和相應的控制器,並且在管理代碼等方面沒有任何問題。我建議使用Main.fxml <-> MainController形式的命名約定。

如果您的控制器需要共享數據,請使用傳遞參數JavaFX FXML中概述的技術

正如@Vertex在評論中指出的那樣, FXMLLoader.setController(...)方法提供了另一種方法。 所以在上面的例子中,你可以做到

@FXML
private void joinAction() {
    Parent root;
    try {
        Stage stage = (Stage) joinButton.getScene().getWindow();
        stage.close();

        FXMLLoader loader = new FXMLLoader (getClass().getResource("main.fxml"));
        loader.setController(this);
        root = loader.load();
        stage = new Stage();
        stage.setTitle("TuneUs");
        stage.setScene(new Scene(root));
        stage.show();

    } catch (IOException e) {e.printStackTrace();}
}

@FXML
private void sendChat() {
    // ...
}

如果您沒有通過FXML注入設置任何字段(控件)(即在fxml中使用fx:id屬性並在控制器中使用相應的@FXML注釋),則此方法很好。 如果是,那么很難跟蹤這些字段的設置時間。 此外,如果多次調用joinAction處理程序,您將擁有main.fxml創建的節點的多個實例,但所有實例共享一個控制器實例(並因此覆蓋相同的注入字段)。 還要注意的是這種方法,您initialize()方法將被調用時, 雙方原有的FXML文件被加載加載main.fxml文件時,它幾乎肯定會產生意外效果。

最后一點:如果您有許多FXML文件和相應的控制器,您可能需要查看afterburner.fx框架 這是一個非常輕量級的框架,它要求FXML文件及其相應控制器的命名約定,並且還提供了一種(非常)簡單的機制,用於在它們之間共享數據。

您需要添加頂級元素fx:controller。 看看這個答案: https//stackoverflow.com/a/41316536/4247308

我創建了 Borderpane,在它里面左邊的 vbox 和中心的場景,還實現了 initializable 。 每次我單擊 vbox 中的 diff 按鈕時,它只會改變場景。 對於每個場景,我都會創建 scene.fxml 文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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