2012-06-30 18 views
44

मेरा आवेदन स्विंग-आधारित है। मैं JavaFX को पेश करना चाहता हूं और इसे द्वितीयक डिस्प्ले पर एक दृश्य प्रस्तुत करने के लिए कॉन्फ़िगर करना चाहता हूं। मैं एक जेएफएक्सपीनल को पकड़ने के लिए जेएफआरएएम का उपयोग कर सकता हूं जो एक जेएफएक्सपैनल पकड़ सकता है लेकिन मैं जावाएफएक्स एपीआई के साथ इसे प्राप्त करना चाहता हूं।जावाएफएक्स 2.1: टूलकिट शुरू नहीं हुआ

sub.sassing com.sun.glass.ui. आवेदन और एप्लिकेशन.लांच (यह) का उपयोग करना एक विकल्प नहीं है क्योंकि इनवॉकिंग थ्रेड अवरुद्ध हो जाएगा।

जब स्विंग EDT से एक स्टेज instantiating, त्रुटि मैं मिलता है:

java.lang.IllegalStateException: Toolkit not initialized 

किसी भी संकेत दिए गए?


संपादित करें: निष्कर्ष

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

समाधान

उपवर्ग JavaFX आवेदन वर्ग और एक अलग थ्रेड जैसे में इसे चलाने:

public class JavaFXInitializer extends Application { 
    @Override 
    public void start(Stage stage) throws Exception { 
     // JavaFX should be initialized 
     someGlobalVar.setInitialized(true); 
    } 
} 

Sidenote: Application.launch() विधि एक तर्क के रूप में एक Class<? extends Application> लेता है क्योंकि, एक JavaFX पर्यावरण को सिग्नल करने के लिए वैश्विक चर का उपयोग करना शुरू कर दिया गया है।

वैकल्पिक दृष्टिकोण: इन्स्तांत स्विंग घटना डिस्पैचर थ्रेड में JFXPanel:

final CountDownLatch latch = new CountDownLatch(1); 
SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     new JFXPanel(); // initializes JavaFX environment 
     latch.countDown(); 
    } 
}); 
latch.await(); 

इस दृष्टिकोण का उपयोग करके बुला धागा जब तक JavaFX वातावरण की स्थापना की है इंतजार करेंगे।

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

+0

नायब बाहर निकलने के लिए है: काम करने के लिए सुझाए गए समाधान स्विंग एप्लिकेशन से जावाएफएक्स के साथ जेएफएक्स पैनेल बनाने और जावाएफएक्स दृश्य को jfxPanel.setScene() विधि में पास करना है। Http://docs.oracle.com/javafx/2/api/javafx/embed/swing/JFXPanel.html –

+0

@ सर्गी ग्रेनेव: ठीक है, लेकिन कुछ घटकों के रूप में JFXPanel के भीतर समस्याएं उपयोग की जा रही हैं, JavaFX 2 को समझने का एक और तरीका स्विंग से अत्यधिक सराहना की जाती है। – dajood

+0

हाय। कौन से घटकों में समस्याएं हैं? –

उत्तर

16

मिले एक समाधान। यदि मैं JavaFX Platform.runLater को आमंत्रित करने से पहले स्विंग ईडीटी से सिर्फ जेएफएक्सपैनल बनाता हूं तो यह काम करता है। मुझे नहीं पता कि यह समाधान कितना विश्वसनीय है, अगर मैं अस्थिर हो जाता हूं तो मैं जेएफएक्स पैनेल और जेएफआरएएम चुन सकता हूं।

public class BootJavaFX { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new JFXPanel(); // this will prepare JavaFX toolkit and environment 
       Platform.runLater(new Runnable() { 
        @Override 
        public void run() { 
         StageBuilder.create() 
           .scene(SceneBuilder.create() 
             .width(320) 
             .height(240) 
             .root(LabelBuilder.create() 
               .font(Font.font("Arial", 54)) 
               .text("JavaFX") 
               .build()) 
             .build()) 
           .onCloseRequest(new EventHandler<WindowEvent>() { 
            @Override 
            public void handle(WindowEvent windowEvent) { 
             System.exit(0); 
            } 
           }) 
           .build() 
           .show(); 
        } 
       }); 
      } 
     }); 
    } 
} 
+0

यदि आपके पास पहले से ही JFXPanel है, तो आप FX कोड को अंदर क्यों नहीं रखना चाहते हैं? –

+0

इस समाधान में जावाएफएक्स पर्यावरण चलाने के लिए केवल एक कामकाज के रूप में JFXPanel का उपयोग कर रहा हूं। मुझे JavaFX में Platform.initialize() जैसी कुछ पसंद आएगी। –

+5

आपको इसे काम करने के लिए सब कुछ करने की ज़रूरत है ??, हास्यास्पद। –

19

जावाएफएक्स के साथ काम करने का एकमात्र तरीका एप्लिकेशन को उपclass करना है या जेएफएक्स पैनेल का उपयोग करना है, ठीक है क्योंकि वे एनवी और टूलकिट तैयार करते हैं।

new Thread(...) का उपयोग करके अवरुद्ध धागा हल किया जा सकता है।

हालांकि मैं अगर तुम घुमाओ/AWT रूप में एक ही वी एम में JavaFX का उपयोग कर रहे JFXPanel उपयोग करने के लिए सुझाव है, आप यहाँ और अधिक जानकारी प्राप्त कर सकते हैं: Is it OK to use AWT with JavaFx?

+0

मैं नई थ्रेड (...) सामान से परहेज कर रहा था क्योंकि मेरा आवेदन स्विंग आधारित है। संकेत के लिए धन्यवाद। –

+0

यह कैसे जुड़ा हुआ है? आप किसी भी जावा कोड में थ्रेड का उपयोग कर सकते हैं। –

+0

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

4

मैं अपने unittest

  • काम करने के लिए

    public class testingTableView { 
         @BeforeClass 
         public static void initToolkit() throws InterruptedException 
         { 
          final CountDownLatch latch = new CountDownLatch(1); 
          SwingUtilities.invokeLater(() -> { 
           new JFXPanel(); // initializes JavaFX environment 
           latch.countDown(); 
          }); 
    
          if (!latch.await(5L, TimeUnit.SECONDS)) 
           throw new ExceptionInInitializerError(); 
         } 
    
         @Test 
         public void updateTableView() throws Exception { 
    
          TableView<yourclassDefiningEntries> yourTable = new TableView<>(); 
          .... do your testing stuff 
    
         } 
        } 
    

    भले ही इस पोस्ट से संबंधित परीक्षण नहीं है, तो यह मुझे पाने के लिए मदद की निम्नलिखित जब परीक्षण JavaFX tableview अद्यतन के लिए unittests बनाने के लिए इस्तेमाल किया पहले क्लास initToolkit के बिना, तब unittest में TableView का तात्कालिकता अनुपलब्ध टूलकिट

01 का संदेश देगा , कारण का उपयोग कर * Impl को com.sun.javafx.application.PlatformImpl#startup(Runnable)

लिटिल बिट hacky, लेकिन, उपयोगी है आप किसी कारण से Application या JXFPanel का उपयोग नहीं करना चाहते हैं:

+0

इसके लिए धन्यवाद ... मैं JavaFX और परीक्षण को समझने की भी कोशिश कर रहा हूं। लेकिन अधिकांश गैर-तुच्छ जावाफैक्स ऑपरेशंस "IllegalStateException उत्पन्न करते हैं: इस ऑपरेशन को केवल ईवेंट थ्रेड पर ही अनुमति है;"। और 'Plaform.runLater() '' Runnable' के अंदर चल रहा है काम नहीं करता है: स्विंग के साथ' EventQueue 'का उपयोग करना हमेशा आवश्यक था।invokeAndWait() '- अन्यथा रननेबल भागने से पहले परीक्षण खत्म हो जाएगा। क्या यह मामला नहीं है कि आपको जावाएफएक्स परीक्षण के लिए टेस्टएफएक्स जैसे एसएचएचजी का उपयोग करना होगा? –

+0

पी एस निश्चित रूप से आप latches का उपयोग कर सकते हैं प्राप्त करने के लिए इस "एक Runnable समाप्त होने की प्रतीक्षा" ... लेकिन यह शायद ही सुरुचिपूर्ण है। –

+0

@mikerodent, मैं इसे एक उपयोगिता उपस्थित होना के लिए प्रतीक्षा करने latches का उपयोग करने के लिए सुंदर नहीं है इस बात से सहमत है, लेकिन जब यह बाहरी संस्थाओं पर निर्भर जा रहा है की बात आती है, तो यह शायद नहीं के रूप में अनाड़ी के रूप में यह – serup

4

वहाँ भी स्पष्ट रूप से टूलकिट प्रारंभ करने में, जिस तरह से फोन करके है।

अपने आप से this post

+1

हो सकता है मैं इस देना चाहता हूँ है एक स्थायी उद्घोषणा का जवाब! मैं दो यूआई रखने के इरादे से एक आवेदन लिख रहा हूं, पहला एफएक्स में है, दूसरा गैर-ग्राफिक। मेरा मॉडल एफएक्स संग्रह का उपयोग करता है। इसके बिना आप संग्रह का उपयोग नहीं कर सकते हैं और ग्राफिक्स तत्व नहीं है। – Bday

+0

ग्राफिक्स से पहले मॉडल शुरू करते समय यह रेस स्थिति भी हल करता है। तो कोई अंत करने के लिए धन्यवाद! – Bday

+0

हैरानी की बात है, यह वास्तव में – piegames

3

फिर से पोस्टिंग मैं स्रोत कोड की जाँच की और यह यह

com.sun.javafx.application.PlatformImpl.startup(()->{}); 

प्रारंभ करने और यह

com.sun.javafx.application.PlatformImpl.exit(); 
संबंधित मुद्दे