2014-06-17 19 views
19

Durante il test della GUI della mia applicazione JavaFX 8, ho notato che alcune etichette non visualizzano il testo anti-alias. Dopo aver cercato su google e in difficoltà, ho scoperto una cosa molto fastidiosa che sta accadendo. L'anti-aliasing viene applicato solo sulle etichette la cui dimensione è maggiore di 80 pixel. Ecco un esempio confrontando applicazioni JavaFX e swing con AA applicato: codiceCome forzare l'anti-aliasing nei caratteri JavaFX?

enter image description here

Esempio: https://gist.github.com/anonymous/be60bb89181376ff12aa

C'è un modo per forzare l'AA in tutte le dimensioni dei caratteri? Questo capita anche a te? Ho cercato un bug simile su JavaFX Jira, ma nessuno si è lamentato fino ad ora. Forse dovrei aprirne uno per questo?

Alcune informazioni che possono aiutare:

java version "1.8.0" 
Java(TM) SE Runtime Environment (build 1.8.0-b132) 
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode) 
Windows 8.1 64 bits [Version 6.3.9600] 
+0

Ho aperto un [bug su Jira] (https://javafx-jira.kenai.com/browse/RT-37705) per questo. –

risposta

27

Per impostazione predefinita, JavaFX 8 utilizza modena.css per impostare il display LCD di anti aliasing, che non sembra per lisciare i font in alcuni casi. Quando la dimensione del carattere è maggiore di 80, la tecnica AA passa alla scala di grigi AA (per problemi di prestazioni). Pertanto, per ottenere bordi lisci di qualsiasi dimensione, è necessario utilizzare la scala di grigi AA.

questo può essere fatto con i CSS:

.text{ 
    -fx-font-smoothing-type: gray; 
} 

oppure attraverso argomenti di sistema:

-Dprism.lcdtext=false 

o il sistema di impostazione delle proprietà:

System.setProperty("prism.lcdtext", "false"); 

ringrazia tutti quelli che ha risposto il Jira!

+2

Penso che il tipo di smoothing del testo predefinito sia "grigio" (vedi https://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html), ma il CSS di Modena lo imposta a "lcd". –

+3

Vale la pena notare che se l'interfaccia utente è caricata da un modello FXML, 'System.setProperty (" prism.lcdtext "," false ");' deve essere chiamato _before_ caricandolo, altrimenti non produrrà alcun effetto. –