2015-03-09 3 views
25

В последнее время JavaFX представляет Alerts (Java 8u40).Предупреждения JavaFX и их размер

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

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

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

Edit: Скриншоты для Windows 7 и Linux (JDK от Oracle): Windows Alert Linux 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(); 
    } 
} 
+0

Эта проблема, кажется, касается того, что вы видите: https://bugs.openjdk.java.net/browse/JDK-8095777. Возможно, это было исправлено в 8u40, однако я все еще вижу проблему с CentOS с 8u45. –

+0

Ошибка все еще присутствует в java8u66 oracle linux (не openjdk). –

+0

См. Также: https://stackoverflow.com/q/33318661/179864 – aditsu

ответ

12

Я сделал следующее временное решение некоторое время назад:

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?

UPDATE:

Не зафиксировано в 8u40. Should be fixed позже.

+2

Да, я использую 8u40. Кажется, это проблема Linux. Он показывает ожидаемый результат в Windows. Однако не знаю об OS X. См. Также скриншоты, которые я добавил, включая свойство 'java.version'. – Spiegelritter

+0

Я думаю, что нужно открыть новую проблему в журнале ошибок JavaFX. Это действительно похоже на проблему с конкретной платформой. –

+0

Я могу только подтвердить проблему. Я использую текущий Debian с установленным jdk 8u40. (+1 для обходного пути!) – philonous

14

Здесь лучше обходной путь без магических чисел, изменение размеров и т.п .:

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.

+0

FYI: JavaFX все еще [cut long text] (http://i.imgur.com/pFawSxb.png) с этим обходным решением: (Env: JDK 1.8.0_91, Ubuntu 14.04 –

+0

@maxd, это не очевидно из вашего скриншота что было полным текстом. Я поставил намного более длинный текст раньше - и мое решение сработало – Sergio

24

Я сделал следующее временное решение:

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

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

+1

Определенно лучший ответ: никаких магических чисел и просто одноразовых настроек. Я фактически расширил класс Alert, добавив эту строку ко всем переопределенным конструкторы. – Gianluca

+0

Большое спасибо @Gianluca –

0

Другого решения подклассы оповещения и применение желаемого стиля есть, например:

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); 
    } 
} 

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

Смежные вопросы