JavaFX 警报及其大小
Posted
技术标签:
【中文标题】JavaFX 警报及其大小【英文标题】:JavaFX Alerts and their size 【发布时间】:2015-05-10 08:05:07 【问题描述】:最近,JavaFX 引入了警报 (Java 8u40)。
考虑下面的代码示例。如何显示比几个单词更长的完整消息?我的消息(contentText
属性)最后被 ...
截断,我认为警报没有正确调整其大小。
在我的装有 Oracle JDK 8u40 的 Linux 机器上,我只能看到文本 This is a long text. Lorem ipsum dolor sit amet
,在某些情况下它太短了。
当然,用户可以手动调整警报窗口的大小并相应地显示文本,但这一点都不友好。
编辑:Windows 7 和 Linux 的屏幕截图(来自 Oracle 的 JDK):
import javafx.application.Application;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.stage.Stage;
public class TestAlert extends Application
public static void main(String[] args)
launch(args);
@Override
public void start(Stage primaryStage) throws Exception
Alert a = new Alert(AlertType.INFORMATION);
a.setTitle("My Title");
a.setHeaderText("My Header Text");
a.setResizable(true);
String version = System.getProperty("java.version");
String content = String.format("Java: %s.\nThis is a long text. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", version);
a.setContentText(content);
a.showAndWait();
【问题讨论】:
这个问题似乎解决了您所看到的问题:bugs.openjdk.java.net/browse/JDK-8095777。据说它已在 8u40 中修复,但是,我仍然在使用 8u45 的 CentOS 上看到问题。 这个bug在java8u66 oracle linux(不是openjdk)中仍然存在。 另见:***.com/q/33318661/179864 【参考方案1】:我做了以下解决方法:
Alert alert = new Alert(AlertType.INFORMATION, "Content here", ButtonType.OK);
alert.getDialogPane().setMinHeight(Region.USE_PREF_SIZE);
alert.show();
所以窗口会根据内容自动调整大小。
【讨论】:
绝对是最好的答案:没有神奇的数字,只有一个位置的调整。我实际上扩展了 Alert 类,将这一行添加到所有重写的构造函数中。 非常感谢@Gianluca 这适用于高度,但是当我对setMinWidth
执行相同操作时,它没有效果。
这仅适用于我首先调用alert.setResizable(true)
(javafx 11,fedora 31)。【参考方案2】:
这是没有幻数、调整大小等更好的解决方法:
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。
【讨论】:
仅供参考:JavaFX 仍然是cut long text 使用此解决方法:( 环境:JDK 1.8.0_91,Ubuntu 14.04 @maxd,从您的屏幕截图中看不出完整的文本是什么。我之前放了更长的文字 - 我的解决方案奏效了【参考方案3】:我前段时间做了以下解决方法:
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();
如您所见,我只是设置了可调整大小的标志并设置了首选大小。
但这很奇怪,因为这个错误should be fixed 在 8u40 中。您使用的是最新版本的 8u40 吗?
更新:
在 8u40 中未修复。 Should be fixed 稍后。
【讨论】:
是的,我使用的是 8u40。这似乎是一个Linux问题。它在 Windows 上显示了预期的结果。虽然不知道OS X。另请参阅我添加的屏幕截图,包括java.version
属性。
我认为需要在 JavaFX 问题跟踪器中打开新问题。这似乎确实是特定于平台的问题。
我只能确认问题。我正在使用安装了 jdk 8u40 的当前 Debian。 (解决方法+1!)
同时确认 linux 问题。 Ubuntu 15.04,jdk 8u40。
这个变通办法实际上有什么帮助?因为如果消息太长,仍然没有自动调整窗口大小。仅当您有某种大窗口可以确保所有消息都适合时,这才有帮助。【参考方案4】:
另一种解决方案是将 Alert 子类化并在其中应用所需的样式,例如:
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);
这样您就不必为您创建的每个警报重复操作。
【讨论】:
【参考方案5】:版本 15 仍然是唯一的解决方法是:
dialog.setResizable(true);
dialog.getDialogPane().setPrefSize(377, 233);
Platform.runLater(() -> dialog.setResizable(false));
【讨论】:
以上是关于JavaFX 警报及其大小的主要内容,如果未能解决你的问题,请参考以下文章
加载和渲染 iframe 及其 CSS 时,如何触发 jQuery 警报?