JavaFX-使用fxml创建自定义对话框
我是javafx新手,我尝试创建自定义对话框/警报。问题是,我正在使用Scene Builder设计GUI,我想在每次加载fxml文件时修改对话框(即更改标题、标签文本等),所以我想知道是否有方法发送参数和修改舞台/场景,或者其他任何方法可以实现这一点JavaFX-使用fxml创建自定义对话框,javafx,dialog,Javafx,Dialog,我是javafx新手,我尝试创建自定义对话框/警报。问题是,我正在使用Scene Builder设计GUI,我想在每次加载fxml文件时修改对话框(即更改标题、标签文本等),所以我想知道是否有方法发送参数和修改舞台/场景,或者其他任何方法可以实现这一点 更具体地说,假设我想在程序中的任何地方处理一个错误,因此我加载一个新的fxml文件来表示我创建的错误对话框,并根据需要处理的错误类型修改其中的组件,类似于,例如,JOptionPane.showMessageDialog(…)在swing中。对于
更具体地说,假设我想在程序中的任何地方处理一个错误,因此我加载一个新的fxml文件来表示我创建的错误对话框,并根据需要处理的错误类型修改其中的组件,类似于,例如,JOptionPane.showMessageDialog(…)在swing中。对于您描述的用例,您可以只使用API或作为其一部分的专用类 对于您提出的更一般的问题: 我想知道是否有办法发送参数并更改舞台/场景 方法是使用文档中描述的机制 简而言之,为加载FXML文件所需的UI类型创建一个子类,并定义所需的属性,例如
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());
}
});
}
}
或
为什么不使用or?James_D,因为我需要所有不同的设计,而且每个信息都应该用另一种语言(不是英语)非常确定他们可以做到这一点,但我会添加一个答案来解决更一般的问题。非常有帮助。谢谢:)。这是旧版本的fxml吗?如果我将其放入文件中,我的场景生成器将无法打开fxml。它抱怨外汇:prefix@MaxiWu这是有效的FXML。我知道早期版本的Scene Builder在
方面有问题;我已经有一段时间没有尝试使用场景生成器了。你们有什么版本?我用的是GLUON最新的版本。也许我遗漏了一些重要的东西,我对其进行了修改,并且scenebuild工作正常。
try {
// some code...
} catch (Exception exc) {
ExceptionPane excPane = new ExceptionPane();
excPane.setException(exc);
Stage stage = new Stage();
stage.setScene(new Scene(excPane));
stage.show();
}