2017-02-24 810 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一段时间。你有什么版本? –