2016-12-27 87 views
0

我想按下按鈕時更新線程(ScheduledService)中文本的值。我可以在GUI中更新文本的值,但該值無法在線程(ScheduledService)中更新。如何更新線程中事件處理程序的值?

我該如何更新線程(ScheduledService)區域中的文本值?

[Procesure]

(1)當我輸入文本的值和按下按鈕時,該值顯示在GUI 通過下面的代碼(在事件處理程序)

label.setText(text); 
    Value = Integer.parseInt(text); 

(2 )我想通過「值」的值由下面的

recieve(Value); 

(3)中的「值」是由下面的代碼所示值線程

System.out.println(a); 

但是,「值」的值不更新,它仍然是「0」。 「0」的值是「值」的初始值。

public Integer Value = 0; 

我的代碼如下:

package javafxapplication16; 

import java.io.IOException; 
import javafx.application.Application; 
import javafx.concurrent.ScheduledService; 
import javafx.concurrent.Task; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.ButtonBuilder; 
import javafx.scene.control.Label; 
import javafx.scene.control.LabelBuilder; 
import javafx.scene.control.TextField; 
import javafx.scene.control.TextFieldBuilder; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.HBoxBuilder; 
import javafx.scene.text.Font; 
import javafx.scene.text.FontPosture; 
import javafx.stage.Stage; 
import javafx.stage.StageBuilder; 


public class JavaFXApplication16 extends Application { 

    public Label  label; 
    public Integer Value = 0; 
    public Button bt_co; 
    public TextField tx; 

    @Override 
    public void start(Stage stage) throws Exception{ 


     tx = TextFieldBuilder.create().text("").build(); 

     Font font = Font.font("Arial",FontPosture.ITALIC,20); 
       label = LabelBuilder.create().text("value") 
          .alignment(Pos.CENTER) 
          .font(font) 
          .prefWidth(200).build(); 


     bt_co = ButtonBuilder.create().text("") 
       .prefWidth(200) 
       .alignment(Pos.CENTER) 
       .id("") 
       .build(); 
     HBox root = HBoxBuilder.create().spacing(100).children(tx,label,bt_co).build(); 

     Scene scene = new Scene(root); 

     scene.addEventHandler(ActionEvent.ACTION,actionHandler); 

     recieve(Value); // pass the value of "Value" to thread 

     stage = StageBuilder.create().width(640).height(640).scene(scene).title(" ").build(); 
     stage.show(); 
    } 

    /* thread */ 
    private void recieve(int a) throws IOException { 

     ScheduledService<Boolean> ss = new ScheduledService<Boolean>() 
     { 
      @Override 
      protected Task<Boolean> createTask() 
      { 

       Task<Boolean> task = new Task<Boolean>() 
       { 
        @Override 
        protected Boolean call() throws Exception 
        { 
         System.out.println(a); 
         return true; 
        }; 
       }; 

       return task;   
      } 

     }; 
     ss.start(); 
    } 

/* Event Handler */ 
    EventHandler<ActionEvent> actionHandler = new EventHandler<ActionEvent>(){ 
     public void handle (ActionEvent e){ 


      Button src =(Button)e.getTarget(); 

       String text = tx.getText(); 

       label.setText(text); 

       Value = Integer.parseInt(text); 

     } 
    }; 


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


} 

回答

1

參數值計算方法被調用之前的權利。這是通過的值,而不是某些可能寫入表達式中作爲函數參數的字段中的值。

這意味着什麼情況是

  1. UI是構建。
  2. 事件處理被添加
  3. receive被執行並當前存儲在Value字段中的值作爲參數,這是0此時通過。
  4. ScheduledService打印0反覆)
  5. 在一段時間內被執行寫一個新值Value
  6. 事件處理(ScheduledService繼續打印0,因爲這是a值)

對於任何不同的行爲,您需要在任務內使用實際更改其值的表達式,例如

volatile Integer Value; 

... 

receive(); 

... 

private void recieve() /* throws IOException */ { 

    ScheduledService<Boolean> ss = new ScheduledService<Boolean>() 
    { 
     @Override 
     protected Task<Boolean> createTask() 
     { 

      Task<Boolean> task = new Task<Boolean>() 
      { 
       @Override 
       protected Boolean call() throws Exception 
       { 
        System.out.println(a); 
        return true; 
       }; 
      }; 

      return task;   
     } 

    }; 
    ss.start(); 
} 

BTW:你應該擺脫建設者的那些用途。它們都在JavaFX 8中被棄用,甚至沒有記錄在javadoc中,並且可能會在JavaFX 9中被刪除。

+0

非常感謝! – kkj