2013-03-27 4 views
9

मैं JavaFX के साथ मेरे सिर स्मैश किया गया है ...JavaFX अन्य अनुप्रयोग

यह जब वहाँ एक आवेदन चल रहा है का कोई उदाहरण है के लिए काम करता है का शुभारंभ:

public class Runner { 

    public static void main(String[] args) { 
     anotherApp app = new anotherApp(); 
     new Thread(app).start(); 
    } 
} 

public class anotherApp extends Application implements Runnable { 

    @Override 
    public void start(Stage stage) { 
    } 

    @Override 
    public void run(){ 
     launch(); 
    } 
} 

लेकिन अगर मैं new Thread(app).start()करना भीतर एक और आवेदन मुझे एक अपवाद मिलता है जिसमें कहा गया है कि मैं दो लॉन्च नहीं कर सकता।

इसके अलावा मेरे विधि इस तरह अन्य अनुप्रयोग पर एक पर्यवेक्षक के द्वारा कहा जाता है:

@Override 
public void update(Observable o, Object arg) { 
    // new anotherApp().start(new Stage()); 
      /* Not on FX application thread; exception */ 

    // new Thread(new anotherApp()).start(); 
      /* java.lang.IllegalStateException: Application launch must not be called more than once */ 
} 

यह इस जैसे एक JavaFX वर्ग के भीतर है:

public class Runner extends Applications implements Observer { 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage){ 
    //...code...// 
    } 
    //...methods..// 
    //...methods..// 

    @Override 
    public void update(Observable o, Object arg) { 
    //the code posted above// 
    } 
} 

मैं श्रोताओं लेकिन इसके साथ ObjectProperties उपयोग करने की कोशिश काम नहीं किया मुझे java.util.observer से कुछ तरीकों से अद्यतन विधि के भीतर से यह नया चरण चलाना होगा।

किसी भी सुझाव का स्वागत है। धन्यवाद।

+1

में लपेट आपका इरादा केवल एक nother विंडो खोलने के लिए है? यदि हां, तो आप यूआई थ्रेड के भीतर एक नया 'चरण' बना सकते हैं: 'अंतिम चरण चरण = नया चरण(); stage.setScene (yourScene); stage.show(); ' – Vertex

+0

हां, मेरा इरादा एक और खिड़की (किसी अन्य वर्ग में आवेदन) खोलना है, लेकिन मुझे इसे java.util.observer से अद्यतन विधि के अंदर यूआई थ्रेड नहीं करना है। –

+1

आप 'runLater' विधि को कॉल करके यूआई थ्रेड में कोड का एक गुच्छा चला सकते हैं:' Platform.runLater (नया रननेबल() {@ ओवरराइड सार्वजनिक शून्य रन() {// यूआई थ्रेड में // रन}}; ' तो आप इसे 'अपडेट' विधि के अंदर कॉल कर सकते हैं। – Vertex

उत्तर

22

एप्लिकेशन सिर्फ एक खिड़की नहीं है - यह Process है। इस प्रकार प्रति वीएम की अनुमति केवल Application#launch() है।

यदि आप एक नई विंडो चाहते हैं - Stage बनाएं।

तुम सच में anotherApp वर्ग का पुन: उपयोग करना चाहते हैं, बस इसे Platform.runLater()

@Override 
public void update(Observable o, Object arg) { 
    Platform.runLater(new Runnable() { 
     public void run() {    
      new anotherApp().start(new Stage()); 
     } 
    }); 
} 
+0

ठीक है। इसने काम कर दिया! अभी के लिए .., दस्तावेज कहता है "भविष्य में एक अनिर्दिष्ट समय पर चलता है"। इसका क्या मतलब है? यह कुछ मामलों में 10 मिनट बाद या ऐसा कुछ चला सकता है? अनिर्दिष्ट समय क्या निर्भर करता है? धन्यवाद। –

+0

आप इसे तुरंत होने की उम्मीद कर सकते हैं। जब तक आप एक साथ 100500 कॉल नहीं करते हैं, तो उन्हें विभाजित दूसरे में निष्पादित किया जाता है :) –

+0

बिल्कुल सही, धन्यवाद। –