जावाएफपी की तुलना डब्ल्यूपीएफ से कैसे की जाती है? [बन्द है]


93

मैं ज्यादातर सी # प्रोग्रामर हूं, मैंने लगभग 10 साल पहले जावा लिखना बंद कर दिया था, लेकिन मैं जावा में तकनीक को लेख पढ़ने, दोस्तों के साथ बात करने आदि के साथ बनाए रखने की कोशिश करता हूं।

मैंने नए समृद्ध GUI फ्रेमवर्क के बारे में सुना है जिसे JavaFX कहा जाता है, लेकिन इसे गैर-जावा समानताएं के साथ तुलना करने वाला कोई भी संसाधन नहीं मिला।

चूँकि मैं C # और WPF से बहुत परिचित हूं, इसलिए मैं यह महसूस करना चाहता हूं कि दोनों प्रौद्योगिकियां समान या भिन्न कैसे होती हैं।

संपादित करें: यह देखते हुए कि कोई उत्तर नहीं आ रहा है, मैं और अधिक विशिष्ट बनने की कोशिश करूंगा:

  1. WPF XAML का उपयोग विजुअल ट्री बनाने के लिए करता है, क्या JavaFX के पास भी कुछ ऐसा ही है?
  2. एक MVVM पैटर्न में व्यू मॉडल के साथ बाइंडिंग के साथ WPF का सबसे अच्छा उपयोग किया जाता है, क्या JavaFX भी बाइंडिंग का व्यापक उपयोग करता है?
  3. WPF रेंडरिंग के लिए GPU का उपयोग करता है, क्या JavaFX भी ऐसा ही करता है?
  4. नेट पीसी पर ब्राउज़र के माध्यम से चलाने पर JavaFX से सिल्वरलाइट की तुलना कैसे होती है?

... और भी आने को है...

मैं इसे कम्युनिटी विकी में बदल रहा हूं ताकि तुलनाएं अपडेट हो सकें (उम्मीद है)।


7
मज़ेदार है कि 83 अपवोट के साथ एक प्रश्न को रचनात्मक नहीं माना जा सकता है।
क्रिश्चियनप

जवाबों:


120

मैं पिछले कुछ हफ्तों से जावाएफएक्स सीख रहा हूं। यहाँ एक उच्च स्तरीय अवलोकन दिया गया है कि यह मेरी नज़र में WPF की तुलना कैसे करता है:

मेरी सभी टिप्पणियाँ JavaFX 2.0 से संबंधित हैं। यह जानकारी संभवतः परिवर्तन के अधीन होगी क्योंकि मंच अभी भी काफी अपरिपक्व है और इसे सक्रिय रूप से विकसित किया जा रहा है।

ग्राफिक्स

WPF की तरह, JavaFX एक बरकरार ग्राफिक्स रेंडरिंग सिस्टम का उपयोग करता है। उपयोगकर्ता इंटरफ़ेस में एक दृश्य ग्राफ शामिल है जो 'नोड्स' से बना है जिसे वैचारिक रूप से WPF के समान माना जा सकता है UIElement

JavaFX यदि उपलब्ध हो तो ग्राफिक्स रेंडर को GPU पर लोड कर देगा। ग्राफिक्स सिस्टम अन्य प्लेटफॉर्म पर विंडोज और ओपनजीएल पर डायरेक्टएक्स का उपयोग करता है।

मार्कअप

JavaFX यूजर इंटरफेस को कोड में और FXML मार्कअप के जरिए बनाया जा सकता है जो कि XAML के समान है जिसमें ऑब्जेक्ट ग्राफ को नेस्टिंग तत्वों द्वारा बनाया जा सकता है।

एफएक्सएमएल में एक्सएएमएल के समान कुछ विशेषताएं हैं जैसे कि संपत्ति बाध्यकारी (केवल सरल अभिव्यक्ति) और इवेंट हैंडलर (कोई भी चालू विधि) के लिए बाइंडिंग । ईवेंट हैंडलर्स को इन-लाइन घोषित किया जा सकता है, लेकिन आमतौर पर आप संबंधित कंट्रोलर में किसी ईवेंट से जुड़ जाते हैं।

एफएक्सएमएल फाइलों में एक संबद्ध नियंत्रक हो सकता है जो आपको जटिल ईवेंट हैंडलर घोषित करने और संपत्तियों के बीच बाइंडिंग स्थापित करने की अनुमति देता है। यह एमवीसी अर्थों में एक नियंत्रक है और WPF दुनिया में एक viewModel के समान नहीं है (आमतौर पर एक नियंत्रक में नोड्स और नियंत्रण के संदर्भ होंगे)।

WPF में एक अंतर यह है कि ऐसा प्रतीत होता है कि FXML BAML की तरह एक मध्यवर्ती द्विआधारी प्रतिनिधित्व में संकलित नहीं है । मैंने अभी तक किसी भी प्रदर्शन के मुद्दों पर ध्यान नहीं दिया है लेकिन सिस्टम का बड़े पैमाने पर उपयोग नहीं किया है। हालांकि मैंने देखा है, कि एफएक्सएमएल आमतौर पर किसी भी एक्सएएमएल से छोटा होता है क्योंकि प्लेटफॉर्म अभी भी आपको कोड लिखने के लिए प्रोत्साहित करता है और शैलियों को अलग से घोषित किया जाता है।

एफएक्सएमएल का परिचय यहां पाया जा सकता है

एक दृश्य बिल्डर मुफ्त (बीयर के रूप में) प्रदान किया जाता है, इसलिए यदि आपको यूआई कोडिंग हाथ पसंद नहीं है तो आप तत्वों को खींच सकते हैं और छोड़ सकते हैं, गुण सेट कर सकते हैं और अपने नियंत्रक में कोड कर सकते हैं और एफएक्सएमएल स्वचालित रूप से उत्पन्न होगा। जाहिर है कि दृश्य बिल्डर एक्सप्रेशन ब्लेंड जितना शक्तिशाली नहीं है, लेकिन विजुअल स्टूडियो द्वारा उपलब्ध कराए गए 'डिजाइनर' से यह अभी भी बेहतर है।

बाइंडिंग

JavaFX के पास बहुत शक्तिशाली संपत्ति और बाध्यकारी प्रणाली है। जावा बीन पैटर्न को उन संपत्तियों को शामिल करने के लिए विस्तारित किया गया है जो एक संपत्ति को संलग्न करते हैं (जिस तरह से WPF निर्भरता गुण गुणों का प्रतिनिधित्व करते हैं)। ये कक्षाएं ऐसे इंटरफेस को लागू करती हैं जो अमान्य प्रदान करते हैं और अधिसूचना बदलते हैं।

अमान्य सूचनाओं और परिवर्तन सूचनाओं के बीच एक अंतर है। अमान्य केवल आपको बताते हैं कि बाध्यकारी अभिव्यक्ति अब अमान्य है और पुनर्गणना की आवश्यकता है; पुनर्गणना वास्तव में तब तक नहीं होती है जब तक कि आप इसके get()या getValue()विधियों के माध्यम से संपत्ति के मूल्य का अनुरोध नहीं करते हैं । यदि आपने एक परिवर्तन श्रोता को पंजीकृत किया है, तो फिर, अभिव्यक्ति का तुरंत पुनर्मूल्यांकन किया जाएगा और जो कुछ भी उस संपत्ति के लिए बाध्य है वह परिवर्तनों को प्रतिबिंबित करेगा।

JavaFX इन संपत्तियों को एक निश्चित और सेट संपत्ति के साथ WPF के समान तरीके से उजागर करता है और एक विधि जो संपत्ति आवरण की एक आवृत्ति लौटाती है (जो WPF गुणों की तरह स्थिर नहीं हैं)।

कई गुणों के बीच जटिल बंधन बनाए जा सकते हैं। एक पूर्णांक संपत्ति दो अन्य (a = b + c) का योग होना चाहते हैं? कोई समस्या नहीं है, जावाएफएक्स इस तरह के संबंधों को व्यक्त करने के लिए एक धाराप्रवाह एपीआई प्रदान करता है

ए। एड (बी, सी);

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

ये अभिव्यक्ति काफी जटिल ईजी a = (b + c) * (d - e)हो सकते हैं और इसमें किसी भी संख्या में गुण शामिल हो सकते हैं। धाराप्रवाह एपीआई पढ़ने और उपयोग करने के लिए काफी आसान है, लेकिन कुछ Microsoft पुस्तकालयों द्वारा दिए गए धाराप्रवाह एपीआई में से कुछ के रूप में अच्छा नहीं है, लेकिन यह स्वयं जावाएफएक्स के बजाय जावा भाषा की सीमाओं से अधिक है।

सरल द्वि-दिशात्मक बाइंडिंग एक ही प्रकार के गुणों के बीच बनाई जा सकती है ताकि यदि एक को अपडेट किया जाए तो यह स्वचालित रूप से परिवर्तन को दर्शाता है।

यदि आप कस्टम बाइंडिंग एक्सप्रेशन बनाना चाहते हैं जो API द्वारा प्रदान नहीं किया गया है या यदि आप प्रदर्शन के बारे में चिंतित हैं तो JavaFX अपने आप को बाइंडिंग को अनुकूलित करने के लिए निम्न स्तर का एपीआई भी प्रदान करता है।

JavaFX और WPF के बीच सबसे बड़ा अंतर यह है कि मुख्य रूप से JavaFX बनाम WPF में बाइंडिंग को मार्क-अप में बाइंडिंग स्थापित करने के तरीके में किया जाता है।

गुण और बाइंडिंग का परिचय यहां पाया जा सकता है

शैलियाँ

JavaFX सीएसएस का उपयोग दृश्य ग्राफ में निहित नोड्स के रूप को बदलने के लिए करता है। एक पूर्ण विनिर्देश उपलब्ध है जो प्रत्येक नोड प्रकार पर सेट किए जा सकने वाले प्रकारों और गुणों की व्याख्या करता है।

जावाएफ़एक्स कुछ परिवर्धन भी प्रदान करता है जो सीएसएस को बेहतर बनाने में मदद करता है जैसे कि चर जिन्हें परिभाषित किया जा सकता है और कहीं और ईजी का उपयोग किया जा सकता है

.button {
    my-custom-color: RGB(234, 44, 78);
}

.my-control {
    -fx-background-color: my-custom-color
}

यह कुछ कार्यों को भी प्रदान करता है जो आपको पहले से परिभाषित अन्य रंगों से रंगों को प्राप्त करने की अनुमति देता है जो ग्रेडिएंट्स जैसी चीजों को बनाने के लिए उपयोगी है। इसका मतलब है कि रंगों के आधार पैलेट को परिभाषित किया जा सकता है और बाकी को इन मूल्यों से उत्पन्न किया जा सकता है (यह डिफ़ॉल्ट जावाएफ़एक्स सीएसएस फ़ाइल करता है)।

जावाएफ़एक्स सीएसएस आपको नोड द्वारा उपयोग किए जाने वाले लेआउट के प्रकार को परिभाषित करने की अनुमति नहीं देता है (जैसा कि यह लिखना कि सभी लेआउट को कोड में निष्पादित करने की आवश्यकता है)। यह मेरे लिए वास्तव में अच्छी तरह से काम करता है क्योंकि यह सीएसएस का एक पहलू था जो HTML के साथ उपयोग करते समय वास्तव में मुझे दर्द करता था।

व्यक्तिगत रूप से मैं सीएसएस को एक्सएएमएल शैलियों के लिए पसंद करता हूं जो मेरी पसंद के लिए बहुत अधिक क्रियात्मक हैं।

जावाएफएक्स सीएसएस के लिए एक गाइड यहां पाया जा सकता है

ख़ाका

JavaFX कई तरह के लेआउट पैन प्रदान करता है जो WPF द्वारा प्रदान किए गए समान हैं। एक अंतर जो मैंने देखा है वह यह है कि माप और लेआउट अनुबंध को Regionवर्ग में वंशानुक्रम श्रृंखला को और अधिक परिभाषित किया गया है ।

जैसा कि पहले उल्लेख किया गया है, लेआउट सीएसएस का उपयोग नहीं किया जा सकता है लेकिन कोड, एफएक्सएमएल का उपयोग करके या दृश्य बिल्डर का उपयोग करके बनाया जा सकता है (जो अंततः एफएक्सएमएल में परिवर्तित हो जाता है)।

नियंत्रण

JavaFX नियंत्रणों की एक बढ़ती हुई लाइब्रेरी प्रदान करता है जिसकी हम उम्मीद करते आए हैं। JavaFX और WPF के बीच एक बड़ा अंतर यह है कि नियंत्रण अनिवार्य रूप से ब्लैक बॉक्स हैं और WPF को जिस तरह से किया जा सकता है उस तरीके से फिर से टेम्पर्ड नहीं किया जा सकता है। वे WPF नियंत्रणों की तुलना में बहुत कम गुणों को उजागर करते हैं।

नियंत्रण सीएसएस के कार्यान्वयन के कुछ विशिष्ट क्षेत्रों को उजागर करते हैं, जिससे नियंत्रण के विशिष्ट क्षेत्रों को आपकी शैलियों द्वारा लक्षित किया जा सकता है। इसे नियंत्रण की उप-संरचना के रूप में जाना जाता है । ईजी CheckBoxदो उपग्रहों को उजागर करता है; बॉक्स और चेक मार्क को नियंत्रण के प्रत्येक भाग को स्वतंत्र रूप से स्टाइल करने की अनुमति देता है। ध्यान दें कि जैसा कि पहले ही वर्णित देखो एक नियंत्रण से सीएसएस का उपयोग कर बदला जा सकता है, लेकिन लग रहा है नहीं कर सकते। ईजी आप नाटकीय रूप TabPaneसे WPF के साथ जिस तरह से अपने आंतरिक लेआउट पैनल बदलकर अपनी सामग्री बाहर देता है जिस तरह से बदल नहीं सकते TabControl

जब भी यह काफी सीमित लगता है, JavaFX में कस्टम नियंत्रण बनाने का पसंदीदा तरीका लगता है कि यह एक लेआउट पैनल से स्थिति मानक नियंत्रणों को प्राप्त करने और सीएसएस का उपयोग करके फिर से स्टाइल करने की तर्ज पर रचना का उपयोग करता है।

निष्कर्ष

कुल मिलाकर मैं इस बात से बहुत प्रभावित हूँ कि JavaFX को इस समय क्या पेशकश करनी है। Whilst यह नहीं है जहाँ WPF के रूप में परिपक्व के रूप में निकट है इसे सक्रिय रूप से विकसित किया जा रहा है और ओरेकल निश्चित रूप से इस का समर्थन कर रहे हैं। समय बताएगा कि यह सफल है या नहीं।

मैं JavaFX को एक कोशिश देने की सलाह दूंगा। प्रलेखन पढ़ें और एक छोटे से आवेदन को एक साथ रखने की कोशिश करें और देखें कि आप क्या सोचते हैं।

आपको FXExperience.com की भी जांच करनी चाहिए जो विकास टीम की जानकारी के साथ नियमित रूप से अपडेट की जाती है।


9
इसके लिए बहुत बहुत धन्यवाद, यह बहुत ही शिक्षित है। यदि आप इस उत्तर को और बढ़ा सकते हैं जैसा कि आप अपने JavaFX के ज्ञान में आगे बढ़ाते हैं तो यह बहुत बढ़िया होगा।
एविएड पी।

5
मुझे भी आपका जवाब पढ़ने में मज़ा आया और अगर जावाएफएक्स के साथ आपका काम आगे की अंतर्दृष्टि का पता चलता है तो मुझे और भी अच्छा लगेगा।
पॉल-सेबेस्टियन मैनोल

21

मुझे लगता है कि जावाएफएक्स के लिए एक महसूस करने का सबसे अच्छा तरीका सिर्फ इसे आज़माना है। जावाएफएक्स वेबसाइट पर कुछ अच्छे ट्यूटोरियल हैं। यहाँ एक जोड़ी है:

वे बहुत तेज हैं और आपको भाषा के लिए एक अच्छा एहसास देते हैं। यदि आप अधिक ट्यूटोरियल और लेखों में रुचि रखते हैं, तो JavaFX साइट पर कई अन्य हैं।

आपके सवालों के विशिष्ट जवाब के लिए:

  1. JavaFX के पास "विज़ुअल ट्री" बनाने के लिए खुद की घोषित भाषा है जो कि xml व्युत्पन्न नहीं है। यूआई एक दृश्य ग्राफ पर आधारित है ताकि आप ग्राफ़ में किसी भी नोड पर विभिन्न प्रभाव और एनीमेशन लागू कर सकें। अधिक जानकारी के लिए ट्यूटोरियल देखें। जावाएफ़एक्स के लिए एक डिजाइनर टूल भी है (जो मैंने अभी तक कोशिश नहीं की है)।
  2. JavaFX ने भाषा में बाइंडिंग का निर्माण किया है
  3. डेस्कटॉप पर JavaFX जावा AWT / स्विंग का उपयोग करता है जो GPU प्रतिपादन का उपयोग करता है। Java का हर वर्जन अपने ग्राफिक्स का ज्यादा हिस्सा GPU पर उतारने लगता है। सन से क्रिस कैंपबेल ने GPU त्वरण के बारे में कुछ ब्लॉग किया है । मुझे यकीन नहीं है कि अगर JavaFX के मोबाइल वर्जन में GPU त्वरण है। मैंने पाया कि JavaFX के पुराने संस्करण मेरे लिए पर्याप्त नहीं थे, लेकिन मुझे पता है कि नवीनतम संस्करण में पिछले संस्करणों में महत्वपूर्ण प्रदर्शन में सुधार है और वे अभी भी इसे और तेज बनाने पर काम कर रहे हैं।
  4. JavaFx ब्राउज़र में चलाने के लिए Java Applets का उपयोग करता है। जावा 6 अपडेट 10 के अनुसार, जावा एप्लेट फ्रेमवर्क को फिर से काम में लाया गया है और हालांकि यह एडोब फ्लैश की तरह सहज नहीं है, यह बहुत सुधार हुआ है। मुझे यकीन नहीं है कि इसकी तुलना सिल्वरलाइट से कैसे की गई है क्योंकि मुझे लिनक्स पर काम करने के लिए सिल्वरलाइट प्राप्त करने में परेशानी हुई है, लेकिन क्या मुझे लिनक्स पर जावाएफ़एक्स काम करने को मिला है।

यहाँ एक और संबंधित प्रश्न है


15
यह उत्तर पुराना है क्योंकि JavaFX जावा 7 में महत्वपूर्ण अपडेट से गुजरा है। यहाँ देखें
ज़ोल्टन

7
क्या आप सुनिश्चित हैं कि JavaFX स्विंग और AWT का उपयोग करता है? मेरा मानना ​​है कि इसका अपना प्रतिपादन इंजन है जिसे प्रिज्म कहा जाता है। JavaFX ऐप चलाते समय कोई ईवेंट डिस्पैच धागा नहीं बनाया जाता है।
एंडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.