2016-12-27 5 views
0

Ich möchte den Wert von Text im Thread (ScheduledService) aktualisieren, wenn ich die Taste drücke. Ich kann den Wert von Text in GUI aktualisieren, aber der Wert ist nicht in der Lage, es in Thread (ScheduledService) zu aktualisieren.Wie aktualisiert man den Wert des Event-Handlers im Thread?

Wie soll ich den Wert von Text im Thread (ScheduledService) -Bereich aktualisieren?

[procesure]

(1), wenn I-Eingang der Wert von Text und den Knopf drückt, wird der Wert in GUI durch den folgenden Code (in Eventhandler)

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

(2 gezeigten) ich möchte, den Wert „Value“ passiere durch den folgenden

recieve(Value); 

(3) den Wert von „Wert“ durch den folgenden Code

gezeigt einzuzufädeln

Aber der Wert von "Value" ist nicht update.it ist immer noch "0". Der Wert von "0" ist der Anfangswert von "Value".

public Integer Value = 0; 

Mein Code ist der folgende:

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); 
    } 


} 

Antwort

1

Parameterwerte werden ausgewertet rechts, bevor die Methode aufgerufen wird. Es wird dieser Wert übergeben, nicht irgendein Wert, der in ein Feld geschrieben werden kann, das in dem als Funktionsparameter verwendeten Ausdruck enthalten ist.

Dies bedeutet, was passiert ist,

  1. UI Build ist.
  2. Ereignishandler wird hinzugefügt
  3. receive ausgeführt wird und der Wert in der Value Feld gespeichert wird als Parameter übergeben, die 0 zu dieser Zeit ist.
  4. (ScheduledService druckt 0 wiederholt)
  5. einen neuen Wert auf das Value Feld Zu einem bestimmten Zeitpunkt des Event-Handler ausgeführt wird, schreibt
  6. (ScheduledService weiter 0 Druck, da dies der Wert a ist)

Für jedes andere Verhalten müssen Sie einen Ausdruck innerhalb der Aufgabe verwenden, der den Wert ändert, z

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: Sie sollten loszuwerden, die Verwendungen von Bauherren erhalten. Sie sind alle veraltet in JavaFX 8, nicht einmal in den Javadocs dokumentiert und werden wahrscheinlich in JavaFX 9 entfernt.

+0

Vielen Dank! – kkj

Verwandte Themen