当我按下按钮时,我想更新线程(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);
}
}
答案 0 :(得分:1)
在调用方法之前评估参数值。它是传递的值,而不是可能写入用作函数参数的表达式中某些字段的某些值。
这意味着会发生什么
receive
已执行,当前存储在Value
字段中的值将作为参数传递,此时为0
。ScheduledService
重复打印0
)Value
字段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中被弃用,甚至在javadocs中都没有记录,并且可能会在JavaFX 9中被删除。