2015-02-12 20 views
6

Sto sviluppando un'applicazione che deve avere un'icona personalizzata. L'icona fornita è la stessa in tutte le taglie (256x256, 48x48, 32x32) tranne che in 16x16 dove l'icona è semplificata.Supporto immagine JavaFX 2.2 per .ico?

Ho pensato al formato .ico (dove posso memorizzare tutte le icone diverse e lasciare che il sistema operativo mostri il meglio) ma non sembra essere supportato dal javafx.scene.image (non ho trovato alcuna conferma al riguardo).

Ecco come ho creato la mia icona

stage.getIcons().add(new Image(getClass().getResourceAsStream("/path/to/icon.ico"))); 

In questo caso l'icona non viene mai visualizzato. Se converto questa icona in un'immagine .png, questa funziona ma impone di visualizzare sempre la stessa icona (anche in 16x16).

C'è un modo in JavaFX 2.2 per visualizzare un .ico (anche in un modo hacky) o devo usare altri formati di immagine?

Aggiornamento

ho separato la mia .ico in png multipla (una per ogni dimensione) e poi di caricarli uno per uno.

stage.getIcons().add(new Image(getClass().getResourceAsStream("/path/to/icon_16x16.png"))); 
stage.getIcons().add(new Image(getClass().getResourceAsStream("/path/to/icon_256x256.png"))); 

La 256x256 e 16x16 sono due immagini diverse, ma la 16x16 è mai mostrato in alto a sinistra dell'applicazione (nonostante questo sia il formato più vicino).

risposta

5

Non credo che JavaFX supporti direttamente il formato ICO. Sono abbastanza sicuro che la lista sia solo JPEG, GIF e PNG, ma devo ancora trovare una fonte ufficiale che confermi questo.

Tuttavia, è possibile utilizzare il mio ICO plugin for ImageIO per leggere il file ICO e convertire l'immagine in un FX Image utilizzando SwingFXUtils.toFXImage(bufferedImage, null).

Nota che il lettore restituisce semplicemente le icone nell'ordine in cui si trovano nel file ICO, quindi ImageIO.read(...) non ti darà l'icona desiderata (leggerà solo la prima). Invece devi leggere ogni icona, convertire e aggiungere tutte le icone sul tuo palco. E FX selezionerà le dimensioni corrette per te. :-)

Qualcosa di simile:

ImageInputStream stream = ImageIO.createImageInputStream(getClass().getResourceAsStream("/path/to/icon.ico")); 
ImageReader reader = ImageIO.getImageReaders(stream).next(); 

reader.setInput(stream); 
int count = reader.getNumImages(true); 

List<Image> fxImages = new ArrayList<>(count); 

for (int i = 0; i < count; i++) { 
    BufferedImage bufferedImage = reader.read(i, null); 
    Image fxImage = SwingFXUtils.toFXImage(bufferedImage, null); 
    fxImages.add(fxImage); 
} 

stream.close(); // Remember to close/dispose in a finally block 
reader.dispose(); 

// ... 

stage.getIcons().addAll(fxImages); 
+1

I upvoted la tua risposta, ma io finalmente andare con png multipla (pre-calcolato) invece di fare questo calcolo per ogni esecuzione. – Spotted

+0

@Spotted Ha senso per me. :-) – haraldK

7

Feature Request

Vedere la relativa richiesta di funzionalità:

La funzione è attualmente non assegnato ad un rilascio, ma puoi votare o commentare se lo desideri.

Caricamento di file ico utilizzando librerie di terze parti

Nel frattempo, è possibile utilizzare varie utility per la creazione di icone in formato java.awt.image.BufferedImage e poi convertirli in JavaFX utilizzando SwingFXUtils. haraldK fornisce un esempio di questo approccio nella sua risposta. Un altro esempio è lo fav icon fetcher for the willow browser, che utilizza la libreria image4j, sebbene la libreria di dodici scimmie di haraldK sia probabilmente la libreria migliore da utilizzare.L'altra alternativa è quella di portare il codice sorgente di una delle librerie di icone basate su aw su JavaFX, facendo uso di uno WritableImage.

Consigli

tuo ragionamento per non usare PNG perché mostra sempre 16x16 è un po 'strano per me, perché la documentazione stage.getIcons() restituisce un elenco di immagini è possibile aggiungere alla (non si è limitato ad aggiungere icona singola). Da javadoc:

Ottiene le immagini delle icone da utilizzare nelle decorazioni delle finestre e quando ridotto a icona. Le immagini devono avere dimensioni diverse della stessa immagine e verrà scelta la dimensione migliore, ad es. 16x16, 32,32.

domanda addizionale

Che cosa succede se, a seconda delle dimensioni, l'immagine non è sempre la stessa

E 'probabilmente OK per fornire immagini diverse. Se il sistema esegue l'interpolazione delle immagini fornite per creare icone di dimensioni non fornite, ciò potrebbe causare un problema, ma ritengo altamente improbabile che il sistema possa farlo. "Le immagini devono avere dimensioni diverse della stessa immagine" è più una linea guida che una regola reale. Se hai bisogno di immagini diverse con dimensioni diverse, prova a fornire più immagini png e guarda cosa succede.

+0

+1 Per menzionare il fatto che puoi usare solo PNG multipli (che è quello che facciamo di solito). Ho già votato, quindi non posso darti un punto in più ... ;-) PS: Perché la password di Kenai JIRA è protetta? – haraldK

+0

@haraldK Non è solo protetto da password. Devi solo registrarti prima di leggere/postare qualsiasi cosa. Tuttavia, non ha senso perché lo rendano obbligatorio per l'accesso in lettura. – ItachiUchiha

+0

@jewelsea Con questo metodo, tutte le immagini devono essere la stessa immagine (ma con diverse dimensioni). Cosa succede se, a seconda delle dimensioni, l'immagine non è sempre la stessa? – Spotted

0

Uso image4j:

ArrayList<Image> lImages = new ArrayList<>(); 
ICODecoder.read(Global.FILE_ICON).stream().forEach((lBufferedImage) -> lImages.add(SwingFXUtils.toFXImage(lBufferedImage, null))); 
this.getStage().getIcons().addAll(lImages); 
Problemi correlati