2015-03-09 10 views
25

Niedawno JavaFX wprowadził alarmy (Java 8u40).Alerty JavaFX i ich rozmiar

Weź pod uwagę przykład kodu poniżej. Jak wyświetlić pełną wiadomość dłuższą niż kilka słów? Moje wiadomości (contentText) są przycinane na końcu przy pomocy ..., a Alert nie dostosowuje poprawnie swojego rozmiaru w mojej opinii.

Na moim komputerze z systemem Linux z Oracle JDK 8u40 widzę tylko tekst This is a long text. Lorem ipsum dolor sit amet, który w niektórych przypadkach jest zbyt krótki.

Oczywiście użytkownik może ręcznie zmienić rozmiar okna Alert, a tekst zostanie wyświetlony odpowiednio, ale nie jest to wcale przyjazne dla użytkownika.

Edit: Zrzuty ekranu dla systemu Windows 7 i Linux (JDK z 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

Ten problem wydaje się odnosić do tego, co widzisz: https://bugs.openjdk.java.net/browse/JDK-8095777. Zostało to rzekomo naprawione w 8u40, jednak nadal widzę problem na CentOS przy 8u45. –

+0

Błąd jest nadal obecny w Linuksie java8u66 oracle (nie openjdk). –

+0

Zobacz także: https://stackoverflow.com/q/33318661/179864 – aditsu

Odpowiedz

12

Zrobiłem następujące obejścia jakiś czas temu:

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

Jak można zobaczyć I po prostu ustaw zmienną flagę i ustaw preferowany rozmiar.

Ale to jest dziwne, ponieważ ten błąd should be fixed w 8u40. Czy korzystasz z najnowszej wersji 8u40?

UPDATE:

nie została ustalona w 8u40. Should be fixed później.

+2

Tak, używam 8u40. Wydaje się, że jest to problem z Linuksem. Pokazuje oczekiwany wynik w systemie Windows. Nie wiem jednak o OS X. Zobacz także zrzuty ekranu, które dodałem, w tym własność 'java.version'. – Spiegelritter

+0

Myślę, że trzeba otworzyć nowy numer w narzędziu do śledzenia problemów JavaFX. To naprawdę wygląda na problem specyficzny dla platformy. –

+0

Mogę tylko potwierdzić problem. Używam bieżącego Debiana z zainstalowanym jdk 8u40. (+1 za obejście tego problemu!) – philonous

14

Oto lepiej obejść bez magicznych liczb, zmiana rozmiaru itp .:

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

To rozwiązanie działa w systemie Windows, Linux i Mac.

+0

FYI: JavaFX jest nadal [wyciąć długi tekst] (http://i.imgur.com/pFawSxb.png) z tym obejściem :(Env: JDK 1.8.0_91, Ubuntu 14.04 –

+0

@maxd, to nie jest oczywiste z twojego zrzutu ekranu jaki był cały tekst, przedłożyłem znacznie dłuższy tekst - i moje rozwiązanie działało – Sergio

24

Zrobiłem następujące rozwiązania:

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

więc okno zmiany rozmiaru automatycznie w zależności od zawartości.

+1

Zdecydowanie najlepsza odpowiedź: brak magicznych liczb i just-one-loc tweak. Rzeczywiście rozszerzyłem klasę Alert dodając tę ​​linię do wszystkich nadpisanych konstruktorzy – Gianluca

+0

Dziękuję bardzo @Gianluca –

0

Innym rozwiązaniem jest instacji Alert i stosowania żądany styl tam, na przykład:

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

W ten sposób nie trzeba powtórzyć procedurę dla każdej tworzonej Alert.

Powiązane problemy