JavaFX警报及其大小

JavaFX警报及其大小,java,javafx,dialog,alert,Java,Javafx,Dialog,Alert,最近,JavaFX引入了警报(Java8U40) 考虑下面的代码示例。我如何显示一条比几句话还要长的完整信息?我的邮件(contentTextproperty)在结尾处被..剪切,我认为警报没有正确调整大小 在使用Oracle JDK 8u40的Linux机器上,我只看到了这是一个长文本。Lorem ipsum dolor sit amet,在某些情况下太短 当然,用户可以手动调整警报窗口的大小,并相应地显示文本,但这根本不是用户友好的 编辑:Windows 7和Linux的屏幕截图(来自Ora

最近,JavaFX引入了警报(Java8U40)

考虑下面的代码示例。我如何显示一条比几句话还要长的完整信息?我的邮件(
contentText
property)在结尾处被
..
剪切,我认为警报没有正确调整大小

在使用Oracle JDK 8u40的Linux机器上,我只看到了
这是一个长文本。Lorem ipsum dolor sit amet
,在某些情况下太短

当然,用户可以手动调整警报窗口的大小,并相应地显示文本,但这根本不是用户友好的

编辑:Windows 7和Linux的屏幕截图(来自Oracle的JDK):


我在前一段时间做了以下变通:

Alert dialog = new Alert(Alert.AlertType.ERROR);
dialog.setHeaderText("Connection Failed");
dialog.setContentText(this.getException().getMessage());

//FIXME: Remove after release 8u40
dialog.setResizable(true);
dialog.getDialogPane().setPrefSize(480, 320);

dialog.showAndWait();
正如您所看到的,我只是设置了可调整大小的标志并设置了首选大小

但这很奇怪,因为8u40中的这个bug。您是否使用最新版本的8u40

更新


未在8u40中修复。稍后。

这里有一个更好的解决方法,无需使用幻数、调整大小等:

Alert alert = new Alert(AlertType.ERROR, "content text");
alert.getDialogPane().getChildren().stream().filter(node -> node instanceof Label).forEach(node -> ((Label)node).setMinHeight(Region.USE_PREF_SIZE));

此解决方案可在Windows、Linux和Mac下运行。

我已制定了以下解决方案:

Alert alert = new Alert(AlertType.INFORMATION, "Content here", ButtonType.OK);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.show();

因此,窗口将根据内容自动调整大小。

另一种解决方案是将警报子类化并在其中应用所需样式,例如:

class SubAlert extends Alert {
    {
        setHeaderText("");
        getDialogPane().getStylesheets().add("some_stylesheet");
        getDialogPane().getStyleClass().add("style_class");
        getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
    }

    SubAlert(AlertType alertType) {
        super(alertType);
    }

    SubAlert(AlertType type, String title, String content) {
        super(type);
        setTitle(title);
        setContentText(content);
    }
}

这样,您就不必为创建的每个警报重复操作。

版本15仍然唯一的解决方法是:

dialog.setResizable(true);
dialog.getDialogPane().setPrefSize(377, 233);
Platform.runLater(() -> dialog.setResizable(false));

是的,我用的是8u40。这似乎是Linux的问题。它显示Windows上的预期结果。不过我不知道OSX。另请参见我添加的屏幕截图,包括
java.version
属性。我认为需要在JavaFX问题跟踪器中打开新问题。这似乎真的是平台特有的问题。我只能确认这个问题。我使用的是当前安装了jdk 8u40的Debian。(+1表示解决方法!)也确认了linux问题。Ubuntu15.04,JDK8U40。这种变通方法到底有什么帮助?因为如果消息太长,仍然无法自动调整窗口大小。只有当你有一个大窗口,可以确保你的所有消息都适合你时,这才有帮助。这个问题似乎解决了你所看到的问题:。它应该是在8u40中修复的,但是,我仍然可以在CentOS上看到8u45的问题。该错误仍然存在于java8u66 oracle linux(而不是openjdk)中。另请参见:仅供参考:JavaFX仍然有此解决方法:(环境:JDK1.8.0[91,Ubuntu 14。04@maxd,从你的屏幕截图上看不出完整的文本是什么。我之前放了一个更长的文本-我的解决方案最终找到了最好的答案:没有神奇的数字,只有一个loc调整。我实际上扩展了警报类,将这一行添加到所有重写的构造函数中。非常感谢@GianlucaThis适用于高度,但当我使用
setMinWidth
进行相同操作时,它不会产生任何效果。这只适用于我,前提是首先调用
alert.setresizeable(true)
(javafx 11,fedora 31)。
dialog.setResizable(true);
dialog.getDialogPane().setPrefSize(377, 233);
Platform.runLater(() -> dialog.setResizable(false));