【问题标题】:JavaFX Alerts and their sizeJavaFX 警报及其大小
【发布时间】: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();
    }
}

【问题讨论】:

标签: java javafx dialog alert


【解决方案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));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 2018-01-02
      • 1970-01-01
      相关资源
      最近更新 更多