0

我已经离开 Java 好几年了,几天前又开始接触它。我需要使用 FXML 创建一个 GUI 并进行一些练习,我正在实现一个小聊天应用程序作为练习。
我想创建一个后台线程来侦听端口并将收到的消息发送到 textArea。根据我的阅读,最好使用“javafx.concurrent”包来完成。

所以我想出了以下内容:

import javafx.concurrent.Service;
import javafx.concurrent.Task;

public class ListenOnPort extends Service<Void> {
    @Override protected Task<Void> createTask() {
        return new Task<Void>() {
            @Override protected Void call() throws Exception {

                updateMessage("Bla!");

                /*
                int max = 50;
                for (int i = 1; i <= max; i++) {                        
                    updateProgress(i, max);
                    updateMessage(String.valueOf(i));

                    Thread.sleep(50);

                }
                */

                return null;
            } //call()
        };
    } //createTask()
}// ListenOnPort

[缩短] 控制器是:

public class FXMLDocumentController {
    @FXML private Label         status;
    @FXML private ProgressBar   progressBar;

    ListenOnPort                listenService;

    @FXML void startListening(ActionEvent event) {
        localPort = Integer.parseInt(listenPort.getText());

        status.setText("Attempting to open local port " +localPort +" for listening.");

        listenService.start();
    }

    @FXML void initialize() {
        // assertions

        listenService = new ListenOnPort();
/*>>>*/ progressBar.progressProperty().bind(listenService.progressProperty());
        status.textProperty().bind(listenService.messageProperty());
    }
}

结果是:

java.lang.NullPointerException
at p2pchat.FXMLDocumentController.initialize(FXMLDocumentController.java:130)

第 130 行是倒数第二行代码,用'/ >>> /' 标记。
为什么我会收到 nullPointerException?我究竟做错了什么?

4

1 回答 1

2

首先,确保您ProgressBar在 .fxml 文件中创建了一个带有fx:idof的元素progressBar

然后在您的 IDE 中单击项目文件夹并按F5,它将刷新 .fxml 并看到最新版本。否则 IDE 将看不到您最近对 .fxml 文件所做的修改,并且会导致NullPointerException.

于 2013-11-05T12:34:48.800 回答