如何更新线程中的事件处理程序的值?

时间:2016-12-27 13:49:25

标签: javafx

当我按下按钮时,我想更新线程(ScheduledService)中的文本值。我可以在GUI中更新文本的值,但该值不能在线程(ScheduledService)中更新它。

如何更新线程(ScheduledService)区域中的文本值?

[Procesure]

(1)当我输入文本的值并按下按钮时,该值显示在GUI中    通过以下代码(在EventHandler中)

 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 个答案:

答案 0 :(得分:1)

在调用方法之前评估参数值。它是传递的值,而不是可能写入用作函数参数的表达式中某些字段的某些值。

这意味着会发生什么

  1. 用户界面正在构建。
  2. 添加了事件处理程序
  3. receive已执行,当前存储在Value字段中的值将作为参数传递,此时为0
  4. ScheduledService重复打印0
  5. 有时会执行事件处理程序,将新值写入Value字段
  6. ScheduledService继续打印0,因为这是a
  7. 的值

    对于任何不同的行为,您需要在任务中使用实际更改其值的表达式,例如

    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中被弃用,甚至在javadocs中都没有记录,并且可能会在JavaFX 9中被删除。