Подтвердить что ты не робот

Предупреждения JavaFX и их размер

В последнее время JavaFX представляет Alerts (Java 8u40).

Рассмотрим пример кода ниже. Как я могу отобразить полное сообщение, которое длиннее, чем несколько слов? Мои сообщения (свойство contentText) обрезаются в конце с помощью ..., и предупреждение не корректирует его размер должным образом, по моему мнению.

На моей машине Linux с Oracle JDK 8u40 я вижу только текст This is a long text. Lorem ipsum dolor sit amet, который в некоторых случаях слишком короткий.

Конечно, пользователь может изменить размер окна "Предупреждение" вручную, и текст будет отображаться соответствующим образом, но это не является удобным для пользователя.

Изменить: скриншоты для Windows 7 и Linux (JDK от Oracle): Windows AlertLinux Alert

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();
    }
}
4b9b3361

Ответ 1

Я сделал следующее обходное решение:

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

Таким образом, окно автоматически изменяет размер в соответствии с содержимым.

Ответ 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.

Ответ 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();

Как вы можете видеть, я просто установил изменяемый размер и установил предпочтительный размер.

Но это странно, потому что эта ошибка должна быть исправлена ​​ в 8u40. Используете ли вы последнюю версию 8u40?

UPDATE

Не зафиксировано в 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);
    }
}

Таким образом, вам не нужно повторять действия для каждого созданного вами оповещения.