2016-02-26 89 views
2

我正在使用IntelliJ IDEA。 我有一個「Clicker遊戲」項目,即時通訊工作,因爲我想學習Java和練習一下。我的JavaFX窗口中的標籤需要不斷更新。我想這樣做的方式是通過Timer和TimerTask,但我在某處讀到這不是一個好主意,而且我寧願使用Worker/Task/Service。實現這個(調用我的Update()方法)只工作一次,但會導致運行時錯誤。我不知道我在做什麼錯,任何人都可以幫助我?JavaFX服務/任務/工人和自動化

更新方法:

public void Update(){ 
    dollarlabel.setText(Double.toString(player.getDollars())); 
    vaselineCost.setText(Double.toString(player.shop.vaseline.cost)); 
    bolCost.setText(Double.toString(player.shop.bol.cost)); 
    appleCost.setText(Double.toString(player.shop.apple.cost)); 
    duikenCost.setText(Double.toString(player.shop.duiken.cost)); 
} 

服務:

public Service service = new Service() { 
    @Override 
    protected Task createTask() { 
     Update(); 
     return null; 
    } 
}; 

啓動該服務的方法:

public void InitializeService(){ 
    service.start(); 
} 

InitializeService被稱爲上的按鈕的按下。理想情況下,它被稱爲在計劃的開始,但嘿..一次問題的權利?

這裏是錯誤,當我呼籲「InitializeService」:http://pastebin.com/jrsVh23R

爲了澄清,我不知道在哪裏的空指針異常從何而來。我宣佈我的變量,然後才被使用,即:

public Label dollarlabel = new Label(); 
public Label vaselineCost = new Label(); 
public Label bolCost = new Label(); 
public Label duikenCost = new Label(); 
public Label appleCost = new Label(); 

任何知道我做錯了什麼的人?提前致謝。

+0

您應該返回NULL以外的東西.. –

回答

1

嘗試是這樣的..

protected Task createTask() { 
return new Task<Void>() { 
    protected String call() throws  Exception 
    { 
     Update(); 
     return null; 
    } 
}; 
} 

從代碼片段在這個link

關於服務的開始改編...

button.setOnAction(new EventHandler<ActionEvent>() 
{ 
    public void handle() 
    { 
     // Call to initilaizeService() 
    } 
}) ; 

爲了解事件處理我用這個link

In update方法通過改變空隙字符串以及..該服務目前成功添加此..

void update() 
{ 
     Platform.runLater (new Runnable() 
     { 
      public void run() 
      { 
       //all calls to setText goes here 
      } 
    }) ; 
} 
+0

這個工作。狀態設置成功後,如何重複該操作?我對事件處理程序還不是很熟悉 –

+0

嗯,我以爲你不在乎泛型的類型,所以我發佈了無效 –

+0

是的,這是一個鼻涕的問題,謝謝你的解決方案。現在的問題是,一旦它執行服務狀態設置爲成功,並不會重複自己。 –