2015-03-09 15 views
25

Recentemente, JavaFX ha introdotto Avvisi (Java 8u40).Avvisi JavaFX e loro dimensione

Considerare l'esempio di codice riportato di seguito. Come posso visualizzare un messaggio completo che è più lungo di poche parole? I miei messaggi (contentText proprietà) vengono tagliati alla fine con ... e l'avviso non regola le sue dimensioni correttamente secondo me.

Sulla mia macchina Linux con Oracle JDK 8u40, vedo solo il testo This is a long text. Lorem ipsum dolor sit amet, che in alcuni casi è troppo breve.

Ovviamente, l'utente può ridimensionare manualmente la finestra di avviso e il testo verrà visualizzato di conseguenza, ma non è affatto user-friendly.

Edit: Screenshots per Windows 7 e Linux (JDK da 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

Questo problema sembra risolvere quello che stai vedendo: https://bugs.openjdk.java.net/browse/JDK-8095777. Si suppone che sia stato risolto in 8u40, tuttavia, vedo ancora il problema su CentOS con 8u45. –

+0

Il bug è ancora presente in java8u66 oracle linux (non openjdk). –

+0

Vedere anche: https://stackoverflow.com/q/33318661/179864 – aditsu

risposta

12

ho fatto la seguente soluzione qualche tempo fa:

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

Come potete vedere ho basta impostare il flag ridimensionabile e impostare la dimensione preferita.

Ma questo è strano perché questo bug should be fixed in 8u40. Stai usando l'ultima build di 8u40?

UPDATE:

Non fissato in 8u40. Should be fixed più tardi.

+2

Sì, sto usando 8u40. Sembra essere un problema di Linux. Mostra il risultato previsto su Windows. Non so su OS X però. Vedi anche gli screenshot che ho aggiunto, inclusa la proprietà 'java.version'. – Spiegelritter

+0

Penso che sia necessario aprire un nuovo problema nel programma di rilevamento dei problemi JavaFX. Questo sembra davvero un problema specifico della piattaforma. –

+0

Posso solo confermare il problema. Sto usando un Debian corrente con jdk 8u40 installato. (+1 per la soluzione alternativa!) – philonous

14

Ecco la soluzione migliore senza numeri magici, il ridimensionamento ecc .:

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

Questa soluzione funziona sotto Windows, Linux e Mac.

+0

FYI: JavaFX è ancora [tagliare il testo lungo] (http://i.imgur.com/pFawSxb.png) con questa soluzione :(Env: JDK 1.8.0_91, Ubuntu 14.04 –

+0

@maxd, non è ovvio dal tuo screenshot Qual è stato il testo completo, ho scritto un testo molto più lungo e la mia soluzione ha funzionato – Sergio

24

ho fatto la seguente soluzione:

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

Quindi la finestra di ridimensionare automaticamente in base al contenuto.

+1

Sicuramente la migliore risposta: nessun numero magico e tweak di solo un loc. Ho effettivamente esteso la classe Alert aggiungendo questa linea a tutti gli override costruttori – Gianluca

+0

Grazie mille @ Gianluca –

0

Un'altra soluzione è sottoclasse l'avviso e l'applicazione di stile desiderato lì, per esempio:

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

In questo modo non c'è bisogno di ripetere le azioni per ogni allarme che si crea.