在JavaFX 8中,有没有办法调整警报的大小,以显示异常的痕迹。 我的代码是:
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setResizable(true);
alert.setTitle(e.getLocalizedMessage());
alert.setHeaderText(e.toString());
alert.setContentText(message); // I previously made this using StackTraceElement[] java.lang.Exception.getStackTrace()
然后我试过了两个:
alert.getDialogPane().getScene().getWindow().sizeToScene();
和
alert.getDialogPane().autosize();
并且都没有效果。
目前,我使用我的JRE是Java 8更新144,而我的JDK是Windows 10 Home 64位版本上的Java 8更新101。有没有办法让我使用Alert框架作为JOptionPane的替代品,因为Swing基本上是死的,所以我可以避免编写监听器和按钮,并保留Alert类提供的交叉图标"
答案 0 :(得分:0)
此代码来自Exception Dialog。
Alert alert = new Alert(AlertType.ERROR);
alert.setTitle("Exception Dialog");
alert.setHeaderText("Look, an Exception Dialog");
alert.setContentText("Could not find file blabla.txt!");
Exception ex = new FileNotFoundException("Could not find file blabla.txt");
// Create expandable Exception.
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
String exceptionText = sw.toString();
Label label = new Label("The exception stacktrace was:");
TextArea textArea = new TextArea(exceptionText);
textArea.setEditable(false);
textArea.setWrapText(true);
textArea.setMaxWidth(Double.MAX_VALUE);
textArea.setMaxHeight(Double.MAX_VALUE);
GridPane.setVgrow(textArea, Priority.ALWAYS);
GridPane.setHgrow(textArea, Priority.ALWAYS);
GridPane expContent = new GridPane();
expContent.setMaxWidth(Double.MAX_VALUE);
expContent.add(label, 0, 0);
expContent.add(textArea, 0, 1);
// Set expandable Exception into the dialog pane.
alert.getDialogPane().setExpandableContent(expContent);
alert.showAndWait();
答案 1 :(得分:0)
我找到了一种使用Java反射执行此操作的方法。
首先必须设置(Ervin Szilagyi的评论)alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
然后使用此方法:
void sizeToScene(Alert alert) {
try {
final Field field = Dialog.class.getDeclaredField("dialog");
field.setAccessible(true);
final Object object = field.get(alert);
final Method method = object.getClass().getMethod("sizeToScene");
method.setAccessible(true);
method.invoke(object);
} catch (SecurityException | IllegalArgumentException | NoSuchFieldException | IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
// logger.catching(e);
}
}
,但最好使用“异常对话框”显示异常的踪迹。
用法示例:
MainThread
private static Alert alert;
public static Optional<Alert> getAlert(){
return Optional.ofNullable(alert);
}
void alertMethod(){
alert = new Alert(AlertType.ERROR);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.setTitle("title");
alert.setHeaderText(null);
alert.setContentText("message");
alert.showAndWait();
}
另一个线程
//...
void addAlertText(String text){
MainThread.getAlert()
.ifPresent(
al->Platform.runLater(()->{
al.setContentText(al.getContentText() + '\n' + text);
sizeToScene(al);
}));
}
//...