2015-02-12 5 views
6

मैं एक ऐसे एप्लिकेशन को विकसित कर रहा हूं जिसमें एक कस्टम आइकन होना चाहिए। प्रदान किया गया आइकन 16x16 को छोड़कर सभी आकारों (256x256, 48x48, 32x32) में समान है जहां आइकन सरलीकृत है।जावाएफएक्स 2.2 .ico के लिए छवि समर्थन?

मैंने .ico प्रारूप (जहां मैं सभी differents आइकन स्टोर कर सकता हूं और ओएस को सर्वश्रेष्ठ दिखा सकता हूं) के बारे में सोचा था, लेकिन यह javafx.scene.image द्वारा समर्थित नहीं प्रतीत होता है (मुझे इसके बारे में कोई पुष्टि नहीं मिली है)।

यहाँ कैसे मैं अपने आइकन

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

की स्थापना इस मामले आइकन कभी नहीं प्रदर्शित किया जाता है में है। यदि मैं इस आइकन को .png छवि में रूपांतरित करता हूं, तो यह हमेशा एक ही आइकन (16x16 में) प्रदर्शित करने के लिए लागू होता है।

क्या .ico (यहां तक ​​कि एक हैकी तरीके से) प्रदर्शित करने के लिए JavaFX 2.2 में कोई तरीका है या क्या मुझे अन्य छवि प्रारूपों का उपयोग करना है?

अद्यतन

मैं कई png (प्रत्येक आकार के लिए एक) और फिर उन्हें एक के बाद एक लोड हो रहा है में मेरी .ico अलग कर दिया।

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

256x256 और 16x16 दो अलग अलग चित्र हैं लेकिन 16x16 आवेदन के शीर्ष बाईं ओर से पता चला कभी नहीं है (के बावजूद इस निकटतम आकार है)।

उत्तर

5

मुझे नहीं लगता कि जावाएफएक्स सीधे आईसीओ प्रारूप का समर्थन करता है। मुझे पूरा यकीन है कि सूची केवल जेपीईजी, जीआईएफ और पीएनजी है, लेकिन मुझे अभी तक एक आधिकारिक स्रोत नहीं मिला है जो इसकी पुष्टि करता है।

हालांकि, आप आईसीओ फ़ाइल पढ़ने के लिए अपने ICO plugin for ImageIO का उपयोग कर सकते हैं, और SwingFXUtils.toFXImage(bufferedImage, null) का उपयोग कर छवि को एक FX Image में परिवर्तित कर सकते हैं।

ध्यान दें कि पाठक आईसीओ फ़ाइल में पाए गए क्रम में आइकन को वापस लौटाता है, इसलिए ImageIO.read(...) आपको वह आइकन नहीं देगा जो आपको चाहिए (यह केवल पहले पढ़ेगा)। इसके बजाय आपको प्रत्येक आइकन को पढ़ने, बदलने और अपने आइकन पर सभी आइकन जोड़ने की आवश्यकता है। और एफएक्स आपके लिए सही आकार का चयन करेगा। :-)

कुछ की तरह:

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

मैं आपका जवाब upvoted लेकिन मैं अंत में कई png (पूर्व गणना) प्रत्येक निष्पादन के लिए इस गणना कर के बजाय साथ जायेंगे। – Spotted

+0

@ स्पॉट मुझे समझ में आता है। :-) – haraldK

7

फ़ीचर अनुरोध

संबंधित सुविधा का अनुरोध देखें:

सुविधा वर्तमान में है रिलीज के लिए आवंटित नहीं किया गया है, लेकिन यदि आप चाहें तो आप वोट या टिप्पणी कर सकते हैं।

तृतीय पक्ष लाइब्रेरी

इस बीच में का उपयोग कर ico फ़ाइलों लोड हो रहा है, तो आप java.awt.image.BufferedImage प्रारूप में प्रतीक बनाने के लिए विभिन्न उपयोगिताओं का उपयोग कर सकते हैं और फिर उन्हें JavaFX में बदलने का SwingFXUtils का उपयोग कर। HaraldK अपने जवाब में इस दृष्टिकोण का एक नमूना प्रदान करता है। एक और उदाहरण fav icon fetcher for the willow browser है, जो image4j लाइब्रेरी का उपयोग करता है, हालांकि हैराल्डके की बारह बंदर लाइब्रेरी संभावित लाइब्रेरी का उपयोग करने की संभावना है।आपका दूसरा विकल्प जावाफ़ेक्स में एक अल्ट आधारित आइकन लाइब्रेरीज़ के स्रोत को पोर्ट करना है, WritableImage का उपयोग करना।

सलाह

png क्योंकि यह हमेशा प्रदर्शित करता है 16x16 थोड़ा मेरे लिए अजीब है का उपयोग नहीं है, क्योंकि stage.getIcons() प्रलेखन आप को जोड़ सकते हैं चित्रों की एक सूची देता है (आप जोड़ तक सीमित नहीं हैं के लिए आपका तर्क एकल आइकन)। जावाडोक से:

खिड़की की सजावट में और आइकन को कम करने के लिए आइकन छवियों को प्राप्त करने के लिए प्राप्त करता है। छवियों को एक ही छवि के विभिन्न आकार होना चाहिए और सबसे अच्छा आकार चुना जाएगा, उदाहरण के लिए। 16x16, 32,32।

अतिरिक्त प्रश्न

क्या होगा अगर, आकार के आधार पर छवि नहीं हमेशा एक ही

है यह विभिन्न छवियों प्रदान करने के लिए शायद ठीक है। यदि सिस्टम प्रदान किए गए आकारों के आइकन बनाने के लिए प्रदान की गई छवियों को इंटरपोलेट करता है जो कि प्रदान नहीं किए जाते हैं, तो इससे कोई समस्या हो सकती है - लेकिन मुझे लगता है कि यह अत्यधिक संभावना है कि सिस्टम ऐसा करेगा। "छवियों को एक ही छवि के विभिन्न आकार होना चाहिए" वास्तविक नियम की तुलना में दिशानिर्देश अधिक है। यदि आपको विभिन्न आकारों पर विभिन्न छवियों की आवश्यकता है, तो इसके लिए एकाधिक पीएनजी छवियों की आपूर्ति करने का प्रयास करें और देखें कि क्या होता है।

+0

+1 इस तथ्य का जिक्र करने के लिए कि आप केवल एकाधिक पीएनजी का उपयोग कर सकते हैं (जो हम आमतौर पर करते हैं)। मैंने पहले ही मतदान किया है, इसलिए मैं आपको एक अतिरिक्त बिंदु नहीं दे सकता ... ;-) पीएस: केनई जीरा पासवर्ड क्यों सुरक्षित है? – haraldK

+0

@haraldK यह सिर्फ पासवर्ड सुरक्षित नहीं है। इसे किसी भी चीज़ को पढ़ने/पोस्ट करने से पहले आपको साइन अप करने की आवश्यकता है। हालांकि, यह समझ में नहीं आता है कि उन्होंने पढ़ने के उपयोग के लिए अनिवार्य क्यों किया। – ItachiUchiha

+0

@jewelsea इस विधि के साथ, सभी छवियों को एक ही छवि होना चाहिए (लेकिन विभिन्न आकारों के साथ)। क्या होगा, आकार के आधार पर, छवि हमेशा एक जैसी नहीं है? – Spotted

0

उपयोग 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); 
संबंधित मुद्दे