【问题标题】:Dialog doesn't resize when TitledPane expandedTitledPane 展开时对话框不会调整大小
【发布时间】:2016-04-12 18:51:14
【问题描述】:

我正在尝试在 DialogPane 的可扩展内容区域中显示错误列表。为了实现这一点,我正在使用带有 Titled Panes 的 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();
    }

}

以下是我想要实现的(我必须手动调整对话框的大小才能得到它):

【问题讨论】:

    标签: javafx


    【解决方案1】:

    关闭 TitledPane 上的动画可解决此问题。似乎存在时间问题,即在调整 TitlePane 大小的动画完成之前尝试调整窗口大小。

    tp1.setAnimated(false);
    

    【讨论】:

    • 我还需要一个与您密切相关的功能。我想像 IntelliJ 输出窗口一样向上/向下调整标题窗格文本区域的大小。我的project iamge 和project github link
    【解决方案2】:

    您可以调整Dialog 的大小,例如:

    pane.getScene().getWindow().setHeight(value);
    

    当您的手风琴展开时,缓冲对话框的当前高度,根据需要更新高度,当您关闭手风琴时,将大小设置回缓冲值

    另一种可能是改变手风琴的prefHeight:

     tp1.expandedProperty().addListener((ov, b, b1) -> {
                if (b1) {
                    accordian.setPrefHeight(value);
                } else {
                    accordian.setPrefHeight(0);
                }
    
                pane.getScene().getWindow().sizeToScene();
                pane.requestLayout();
            });
    

    【讨论】:

    • 感谢您的想法。调整对话框大小有效,除了将对话框设置回其原始大小时,“更多详细信息”和“确定”按钮消失?如果我手动调整对话框大小,它们会再次出现。我已经尝试过第二个建议,但与自动调整大小相关的任何操作都无法按预期工作。
    猜你喜欢
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多