当TitledPane扩展时,Dialog不会调整大小

时间:2016-04-12 18:51:15

标签: javafx

我试图在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();
    }

}

以下是我想要实现的目标(我必须手动调整对话框以实现此目的):

enter image description here

2 个答案:

答案 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();
        });