JavaFX

2013-03-27 12 views
9

Ben JavaFX ile başımı çökertilmesi oldum başka bir uygulama ... Bu uygulama çalışan hiçbir örneği varken için çalışırJavaFX

başlatmak:

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(); 
    } 
} 

Ama içinde new Thread(app).start()yaparsanız Başka bir uygulama iki lansmanı yapamayacağımı belirten bir istisna alıyorum. Ayrıca benim yöntem bu gibi diğer uygulamaya bir gözlemci tarafından çağrılır

:

O bunun gibi bir JavaFX sınıf içinde var
@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 */ 
} 

:

Ben dinleyicileri ama onunla ObjectProperties kullanarak çalıştı
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// 
    } 
} 

işe yaramadı Bu yeni aşamayı java.util.observer'dan bir şekilde güncelleme yönteminin içinden çalıştırmam gerekiyor.

Herhangi bir öneri memnuniyetle karşılanır. Teşekkürler.

+1

sarın? Eğer evet ise, UI Thread içinde yeni bir 'Stage' yaratabilirsiniz:' final Stage stage = new Stage(); stage.setScene (yourScene); stage.show(); ' – Vertex

+0

Evet, amacım başka bir pencereyi açmaktır (başka bir sınıftaki uygulama), ancak bunu java.util.observer'ın kullanıcı arabiriminden değil güncelleme yönteminin içinde yapmak zorundayım. –

+1

"runLater" yöntemini çağırarak UI iş parçacığına bir kod koyabilirsiniz: Platform.runLater (yeni Runnable() {@Override public void run() {// UI iş parçacığında çalışır}}); ' Böylece 'update' yönteminin içinden de diyebilirsiniz. – Vertex

cevap

22

Uygulama sadece bir pencere değil - bir Process. Böylece, VM başına sadece bir Application#launch()'a izin verilir.

Yeni bir pencereye sahip olmak istiyorsanız, bir Stage oluşturun. Eğer gerçekten anotherApp sınıfını yeniden kullanmak istiyorsanız

, sadece niyeti sadece nother penceresini açmak için mi Platform.runLater()

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

Tamam. İşe yaradı! şimdilik ama .., belgeler "gelecekte belirtilmemiş bir zamanda çalışır" der. Bu ne anlama geliyor? Bundan sonra 10 dakika ya da bazı durumlarda böyle bir şey olabilir? Belirtilmemiş süre neye bağlıdır? Teşekkürler. –

+0

Anında olmasını bekleyebilirsiniz. Aynı anda bu tür çağrıları 100500 yapmadıkça onlar bölünmüş ikinci olarak çalıştırılır :) –

+0

Mükemmel, teşekkürler. –