2017-02-24 150 views
2

我是javafx中的新成員,我嘗試創建自定義對話框/警報。問題是我使用Scene Builder來設計GUI,並且每次加載fxml文件(即更改標題,標籤文本等)時我都想修改對話框,所以我想知道是否有發送參數和修改舞臺/場景的方式,或者我可以實現的其他方式。JavaFX - 使用fxml創建自定義對話框

爲了更具體一些,假設我想在程序中的任何地方處理錯誤,所以我加載了一個新的fxml文件,它代表我創建的錯誤對話框,並根據類型修改其中的組件我需要處理的錯誤,類似於swing中的JOptionPane.showMessageDialog(...)。

+0

爲什麼:

<!-- imports etc --> <fx:root type="BorderPane" ...> <center> <TextArea fx:id="stackTrace" editable="false" wrapText="false" /> </center> <top> <Label fx:id="message" /> </top> </fx:root> 

現在你可以直接在Java或在FXML使用:

public class ExceptionPane extends BorderPane { private final ObjectProperty<Exception> exception ; public ObjectProperty<Exception> exceptionProperty() { return exception ; } public final Exception getException() { return exceptionProperty().get(); } public final void setException(Exception exception) { exceptionProperty().set(exception); } @FXML private final TextArea stackTrace ; @FXML private final Label message ; public ExceptionPane() throws Exception { FXMLLoader loader = new FXMLLoader(getClass().getResource("path/to/fxml")); loader.setRoot(this); loader.setController(this); loader.load(); exception.addListener((obs, oldException, newException) -> { if (newException == null) { message.setText(null); stackTrace.setText(null); } else { message.setText(newException.getMessage()); StringWriter sw = new StringWriter(); newException.printStackTrace(new PrintWriter(sw)); stackTrace.setText(sw.toString()); } }); } } 

然後用"dynamic root"定義FXML不只是使用['Alert'](http://docs.oracle.co m/javase/8/javafx/api/javafx/scene/control/Alert.html)或['Dialog'](http://docs.oracle.com/javase/8/javafx/api/javafx/scene/control /Dialog.html)? –

+0

James_D,因爲我需要所有不同的設計,而且每個信息都應該是另一種語言(不是英語) – Askiin

+0

很確定他們可以這樣做,但我會添加一個答案來解決更一般的問題。 –

回答

3

對於您描述的用例,您可以使用Dialog API或屬於該類的專用Alert類。

對於較爲普遍的問題你問:

我想知道是否有發送參數和更改階段/場景

做到這一點的方式方法是使用custom component機制在文檔中描述。

簡而言之,製作您需要的UI類型的子類,以加載FXML文件並定義您需要的屬性,例如,

try { 
    // some code... 
} catch (Exception exc) { 
    ExceptionPane excPane = new ExceptionPane(); 
    excPane.setException(exc); 
    Stage stage = new Stage(); 
    stage.setScene(new Scene(excPane)); 
    stage.show(); 
} 

<fx:define fx:id="exc"><!-- define exception somehow --></fx:define> 

<ExceptionPane exception="${exc}" /> 
+0

非常有幫助。謝謝 :)。 – Askiin

+0

這是fxml的舊版本嗎?如果我將它放入文件中,我的場景構建器無法打開fxml。它抱怨fx:前綴 –

+0

@MaxiWu這是有效的FXML。我知道Scene Builder的早期版本遇到''的問題;我還沒有嘗試過使用Scene Builder一段時間。你有什麼版本? –