2016-09-03 8 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-адрес и попытался обновить пользовательский интерфейс, но я получил исключение java.lang.NullPointerException на 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"); 
      } 
     }); 
    } 
} 

и ниже мой Scene.fxml

<?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> 

Как я могу обновить textIp текстовое поле из класса IpTask?

+0

почему вы используете тему, это просто получить IP-адрес, вам не нужны! –

+0

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

ответ

2

Поля вводятся в экземпляр контроллера, который используется с FXMLLoader. IpTask не используется в качестве контроллера, и поэтому ничего не вводится в поле.

Внесите поле на контроллер и отправьте его на адрес IpTask. Кроме того, вам не нужно использовать Platform.runLater в методе succeeded, так как он вызывается в потоке приложений 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"); 
    } 
} 
Смежные вопросы