2016-09-03 15 views
0

次のJavaFxプログラムは、ボタンを押すとマシン上の現在のIPアドレスを取得し、それを画面に表示することになっています。私は仕事にすべてを得ているが、私はタスクタスクを拡張するクラスからのテキストを更新する

MainApp.java

public class MainApp extends Application { 
    @Override 
    public void start(Stage stage) throws Exception { 
     Parent root = FXMLLoader.load(getClass().getResource("/fxml/Scene.fxml")); 

     Scene scene = new Scene(root); 
     scene.getStylesheets().add("/styles/Styles.css"); 

     stage.setAlwaysOnTop(true); 
     stage.setTitle("IP Viewer"); 
     stage.setScene(scene); 
     stage.show(); 
    } 

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

私FXMLController

public class FXMLController implements Initializable { 

    @FXML 
    private void handleButtonAction(ActionEvent event) { 

     Task<Void> task = new IpTask();; 

     Thread thread = new Thread(task); 
     thread.setDaemon(true); 
     thread.start(); 

    } 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // TODO 
    } 
} 

IpTaskを拡張するクラスからのテキストを更新した問題だ:それは現在を取得しますIPアドレスを変更してUIを更新しようとしましたが、textIp.setTextの例外を受け取ります。textIp.setText

public class IpTask extends Task<Void> { 

    @FXML 
    private Text textIp; 

    @Override 
    protected Void call() throws Exception { 
     Common common = new Common(); 
     Ip ip = common.getIp(); 
     System.out.println("You clicked me!"); 
     return null; 
    } 

    @Override 
    protected void failed() { 
     System.out.println("Failed!"); 
    } 

    @Override 
    protected void succeeded() { 
     System.out.println("Updated"); 
     Platform.runLater(new Runnable() { 
      @Override 
      public void run() { 
       textIp.setText("JUST TO SEE IF THE TEXT GETS SET"); 
      } 
     }); 
    } 
} 

以下は、どのように私はIpTaskクラスからtextIpテキストフィールドを更新することができますか?

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml" fx:controller="com.limitedenterprisesinc.ipviewer.FXMLController"> 
    <children> 
     <Button layoutX="126" layoutY="90" text="Click Me!" onAction="#handleButtonAction" fx:id="button" /> 
     <!-- <Label layoutX="126" layoutY="120" minHeight="16" minWidth="69" fx:id="label" /> --> 
     <javafx.scene.text.Text layoutX="126" layoutY="140" fx:id="textIp"/> 
    </children> 
</AnchorPane> 

私Scene.fxmlですか

+0

、ちょうどあなたがそれらを必要としない、IPを取得しています! –

+0

http://stackoverflow.com/questions/9481865/getting-the-ip-address-of-the-current-machine-using-java –

答えて

2

フィールドは、FXMLLoaderで使用されるコントローラインスタンスに注入されます。 IpTaskはコントローラとして使用されないため、フィールドに何も注入されません。

フィールドをコントローラに注入し、IpTaskに渡します。さらに、succeededメソッドでPlatform.runLaterを使用する必要はありません。これはJavaFXアプリケーションスレッドで呼び出されるためです。あなたがスレッドを使用しない理由

public class FXMLController implements Initializable { 

    @FXML 
    private Text textIp; 

    @FXML 
    private void handleButtonAction(ActionEvent event) { 
     Task<Void> task = new IpTask(textIp); 

     Thread thread = new Thread(task); 
     thread.setDaemon(true); 
     thread.start(); 
    } 

    ... 
} 
public class IpTask extends Task<Void> { 

    private final Text textIp; 

    public IpTask(Text textIp) { 
     if (textIp == null) { 
      throw new IllegalArgumentException(); 
     } 
     this.textIp = textIp; 
    } 

    ... 

    @Override 
    protected void succeeded() { 
     System.out.println("Updated"); 
     textIp.setText("JUST TO SEE IF THE TEXT GETS SET"); 
    } 
} 
関連する問題