2017-02-03 7 views
1

私はコードが初期化される前に実行される問題に苦しんでいます。JAVAFX:Stage.show()の後に関数を実行するには?

@FXML 
    public void Start(int pesel) throws IOException { 
     klientPesel = pesel; 
     root = FXMLLoader.load(getClass().getClassLoader().getResource("klientScene.fxml")); 
     Main.mainStage.setTitle("Agencja Ubezpieczniowa - Agent"); 
     Scene scene = new Scene(root,800,600); 
     Main.mainStage.setScene(scene); 
     Main.mainStage.show(); 
     obtainKlient(); 
     setKlientLabels(); 
    } 

ので、正確な問題は、私は、変数@FXML private VBox KlientInfoVBOX;を持っており、それがsetKlientLabels()実行する前に初期化されていないということです。 Main.mainStage.show();の後にsetKlientLabels()が実行されるようにするにはどうすればよいですか?私は例外がない実行するためのコードからsetKlientLabels()を削除した場合

Mabeyのスタックトレースが問題

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException 
    at app.KlientSearchController.setKlientLabels(KlientSearchController.java:69) 
    at app.KlientSearchController.Start(KlientSearchController.java:51) 
    at app.UserSceneController.StartKlientSearch(UserSceneController.java:87) 
    at app.UserSceneController.lambda$wyszukajKlienta$0(UserSceneController.java:70) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49) 
    at javafx.event.Event.fireEvent(Event.java:198) 
    at javafx.scene.Node.fireEvent(Node.java:8411) 
    at javafx.scene.control.Button.fire(Button.java:185) 
    at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96) 
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89) 
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218) 
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238) 
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191) 
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56) 
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114) 
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74) 
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54) 
    at javafx.event.Event.fireEvent(Event.java:198) 
    at javafx.scene.Scene$MouseHandler.process(Scene.java:3757) 
    at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485) 
    at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762) 
    at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:352) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:275) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:388) 
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389) 
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:387) 
    at com.sun.glass.ui.View.handleMouseEvent(View.java:555) 
    at com.sun.glass.ui.View.notifyMouse(View.java:937) 
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) 
    at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191) 
    at java.lang.Thread.run(Thread.java:745) 

を解決するのに役立ちます、eveyrhtingはsmoothily実行されます。

+0

ルックを使用して、それを解決し、それはあなたが新しいスレッドに何かを起動することができますので、後のコードが実行される – azro

+1

変数はコントローラで初期化されて、いません現在のオブジェクトにあります。 –

答えて

0

StageonShowingProperty()を設定する必要があります。ステージが表示されたら、onShowingProperty()が解雇されます。 onShowingProperty()を設定するには、単にsetOnShowing()メソッドを使用します。

Main.mainStage.setOnShowing(new EventHandler<WindowEvent>() { 
    @Override 
    public void handle(WindowEvent event) { 
     setKlientLabels(); 
    } 
}); 
Main.mainStage.show(); 
+0

'setKlientLabels()'は今すぐ起動しません。 – Dreik

+0

申し訳ありませんが、私は私の答えを編集しました。私はそれがうまくいきたい – Renato

-1

問題は、私は@FXML private VBox KlientInfoVBOX;に私のrefrenceがnullだったので、地雷を作成し、AFTER FXMLは、オブジェクトの独自のインスタンスを作成していたということでした。私はstatic VBOX klientInfoVBOXを作成し、Googleで「タスクjava8」について

public void initialize(){ 
     if(KlientInfoVBOX != null) { 
      klientInfoVBOX = KlientInfoVBOX; 
     } 
    } 
+0

誰かが私に働くコードのために-1を与えるのはなぜですか? – Dreik

+0

おそらくこれは非常に悪い解決策です。同じFXMLファイルを2回読み込む機能をこれに追加する必要があった場合は、コントローラがVBoxの2つの異なるインスタンスを区別できない恐れがあります。 (実際に何が起こっているのか:2つの異なるFXMLファイルに対して同じコントローラクラスを使用しているのか、同じFXMLを2回ロードしているのか、それとも別のものをロードしていますか?)あなた自身の質問に答えるには、一般的に他のユーザーにとって便利な保守可能なコードを持つソリューションです。 –

関連する問題