2013-05-03 149 views
1

經過大量搜索,我發現這個問題How to create a javafx 2.0 application MDI。我真正想知道的是,如果我可以使用JavaFX組件和Scene Builder爲主窗口創建彈出式窗口或子窗口來創建新窗口。JavaFX 2.0 FXML子窗口

我結束了此一模式彈出窗口:

在主類,我想初級階段保存到一個領域,我可以從我的主控制器類訪問。所以,我增加了一個靜態變量舞臺給它,這在Main.Start()方法:

primaryController.primaryStage = primaryStage; 

這是在primaryController一個按鈕使用方法:

public void OnBtnShowChild(ActionEvent event) { 
    MessageBoxController msgBox = new MessageBoxController(); 
    try { 
     msgBox.showMessageBox(primaryStage); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

這是我在Scene Builder的幫助下創建的MessageBoxController類。它具有標準彈出框的基本佈局,可用於顯示圖標(ImageView),TextBox(用於消息文本)和兩個按鈕(用於YES/NO功能)。我不知道如何讓它將按鈕的結果傳遞給primaryController。

public class MessageBoxController implements Initializable { 

@FXML 
// fx:id="btnNo" 
private Button btnNo; // Value injected by FXMLLoader 

@FXML 
// fx:id="btnYes" 
private Button btnYes; // Value injected by FXMLLoader 

@FXML 
// fx:id="imgMessage" 
private ImageView imgMessage; // Value injected by FXMLLoader 

@FXML 
// fx:id="txtMessage" 
private TextField txtMessage; // Value injected by FXMLLoader 

private Stage myParent; 
private Stage messageBoxStage; 

public void showMessageBox(Stage parentStage) { 
    this.myParent = parentStage; 

    try { 
     messageBoxStage = new Stage(); 
     AnchorPane page = (AnchorPane) FXMLLoader.load(MessageBoxController.class.getResource("/MessageBox/MessageBoxFXML.fxml")); 
     Scene scene = new Scene(page); 
     messageBoxStage.setScene(scene); 
     messageBoxStage.setTitle("Message Box"); 
     messageBoxStage.initOwner(this.myParent); 
     messageBoxStage.initModality(Modality.WINDOW_MODAL); 
     messageBoxStage.show(); 
    } catch (Exception ex) { 
     System.out.println("Exception foundeth in showMessageBox"); 
     ex.printStackTrace(); 
    } 
} 
@Override 
public void initialize(URL fxmlFileLocation, ResourceBundle arg1) { 
    txtMessage.setText("Howdy"); 

} 

public void OnBtnYes(ActionEvent event) { 

} 

public void OnBtnNo(ActionEvent event) { 

} 

}

最後,這是我在場景製作工具製作FXML文件:

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.net.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.image.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.layout.AnchorPane?> 

<AnchorPane id="AnchorPane2" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" 
     prefHeight="172.0" prefWidth="524.0" xmlns:fx="http://javafx.com/fxml" fx:controller="MessageBox.MessageBoxController"> 
    <children> 
    <VBox prefHeight="172.0" prefWidth="524.0" styleClass="vboxes" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"> 
     <children> 
     <HBox alignment="CENTER" prefHeight="109.99990000000253" prefWidth="516.0" spacing="30.0"> 
      <children> 
      <ImageView fx:id="imgMessage" fitHeight="110.0" fitWidth="146.66666666666666" pickOnBounds="true" preserveRatio="true" styleClass="null" /> 
      <TextField fx:id="txtMessage" editable="false" prefHeight="47.0" prefWidth="325.0" /> 
      </children> 
      <stylesheets> 
     <URL value="@MyCSS.css" /> 
     </stylesheets> 
    </HBox> 
    <HBox alignment="CENTER" prefHeight="58.0" prefWidth="516.0" spacing="30.0"> 
     <children> 
     <Button fx:id="btnYes" mnemonicParsing="false" onAction="#OnBtnYes" text="Button" /> 
     <Button fx:id="btnNo" mnemonicParsing="false" onAction="#OnBtnNo" text="Button" /> 
     </children> 
    </HBox> 
    </children> 
    <stylesheets> 
    <URL value="@MyCSS.css" /> 
    </stylesheets> 
</VBox> 
</children> 
<stylesheets> 
<URL value="@MyCSS.css" /> 
</stylesheets> 
</AnchorPane> 

有了這個,我可以創造一個模式彈出窗口,我也想創建其他子窗口以使用不同的控件以其他方式顯示數據。最重要的是,我可以使用Scene Builder創建佈局。

您認爲如何?這是否是一種很好的方式,直到他們在Java 8和JavaFX 8中增加真正的支持?

+1

您的解決方案很好。在「我把它結束了」之後,把所有內容都從問題中刪去,並把它作爲自己的答案添加並標記答案是正確的。 – jewelsea 2013-05-03 01:21:48

+0

我明白了。我是Java的新手,剛剛學習了JavaFX,學習了可用的教程並進行了Google搜索。除了基礎知識之外,信息並不存在。因此,即使看起來有效,我也不知道如果我發佈的是解決問題的好方法。如果這是一個好的解決方案,爲什麼沒有人會想到這一點?我發現的其他東西都沒有使用JavaFX。 – 2013-05-03 03:03:45

+0

大多數[JavaFX消息框解決方案](http://stackoverflow.com/questions/11662857/javafx-2-1-messagebox)只是普通的Java代碼,而不是使用FXML進行佈局。我提交了文檔請求[RT-27567 創建了一個關於如何創建通用應用程序對話框的官方教程](https://javafx-jira.kenai.com/browse/RT-27567)。 – jewelsea 2013-05-03 05:00:16

回答

2

你是否嘗試過集體課?你可以用fxml和控制器添加不同的元素。

Group root= new Group(); 
AnchorPane frame=FXMLLoader.load(getClass().getResource("frame.fxml")); 
AnchorPane content= FXMLLoader.load(getClass().getResource("principal.fxml")); 
root.getChildren().add(window); 
root.getChildren().add(frame); 
Scene scene = new Scene(root); 
stage.setScene(scene); 
stage.show();