我试图在DialogPane的expandableContent区域中显示错误列表。为了达到这个目的,我使用的是带有标题窗格的Accordian。如果用户想要查看异常堆栈跟踪,他们可以展开标题窗格以查看详细信息。
我遇到的困难是,当手风琴扩展时,对话框不会调整大小。
我尝试按照https://stackoverflow.com/a/31208445/4931921添加以下内容但未成功:
tp1.expandedProperty().addListener( (obs, oldValue, newValue) -> {
Platform.runLater( () -> {
tp1.requestLayout();
tp1.getScene().getWindow().sizeToScene();
} );
} );
以下是一个例子:
import java.io.PrintWriter;
import java.io.StringWriter;
import javafx.application.Application;
import javafx.scene.control.Accordion;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.control.DialogPane;
import javafx.scene.control.TextArea;
import javafx.scene.control.TitledPane;
import javafx.stage.Stage;
public class AccordianTest extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Dialog dialog = new Dialog();
DialogPane pane = new DialogPane();
pane.setHeaderText( "Test" );
pane.getButtonTypes().add( ButtonType.OK );
dialog.setDialogPane( pane );
Accordion accordian = new Accordion();
TitledPane tp1 = new TitledPane();
accordian.getPanes().add(tp1);
tp1.setText("My TitledPane");
TextArea ta = new TextArea();
ta.setText( getStackTrace() );
tp1.setContent( ta );
tp1.expandedProperty().addListener( (obs, oldValue, newValue) -> {
Platform.runLater( () -> {
tp1.requestLayout();
tp1.getScene().getWindow().sizeToScene();
} );
} );
pane.setExpandableContent(accordian);
dialog.showAndWait();
}
public static void main(String[] args) {
launch(args);
}
private String getStackTrace(){
StringWriter sw = new StringWriter();
new RuntimeException().printStackTrace( new PrintWriter( sw ) );
return sw.toString();
}
}
以下是我想要实现的目标(我必须手动调整对话框以实现此目的):
答案 0 :(得分:1)
关闭TitledPane上的动画解决了这个问题。似乎存在一个计时问题,即在调整TitlePane大小的动画完成之前,尝试调整窗口大小。
tp1.setAnimated(false);
答案 1 :(得分:0)
您可以调整Dialog
的大小:
pane.getScene().getWindow().setHeight(value);
当您的手风琴扩展时,缓冲对话框的当前高度,根据需要更新高度,当您关闭手风琴时,将大小设置回缓冲值
另一种可能性是改变手风琴的前提:
tp1.expandedProperty().addListener((ov, b, b1) -> {
if (b1) {
accordian.setPrefHeight(value);
} else {
accordian.setPrefHeight(0);
}
pane.getScene().getWindow().sizeToScene();
pane.requestLayout();
});