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