javafx NullPointerException with controlsfx Notifications components

Ich möchte eine Anwendung entwickeln, die controlsfx Notifications verwendet, um einige Benachrichtigungen im Taskleistenmodus anzuzeigen. Im normalen Modus funktioniert meine Anwendung einwandfrei und die Benachrichtigung kann erfolgreich angezeigt werden. Wenn ich jedoch die Phase in der Taskleiste verstecke, tritt eine NullPointerException auf. Ich weiß nicht, wie ich dieses Problem beheben kann.

import java.awt.AWTException;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionListener;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;


public class TryIconNotification extends Application {
           private boolean firstTime;
private TrayIcon trayIcon;
@Override
public void start(Stage stage) throws Exception {
    firstTime = true;
    Parent root = FXMLLoader.load(getClass().getResource("FXMLDocument.fxml"));

    Scene scene = new Scene(root);

     createTrayIcon(stage);
    firstTime = true;
    Platform.setImplicitExit(false);


    stage.setScene(scene);
    stage.show();
}


    public void createTrayIcon(final Stage stage) {
    if (SystemTray.isSupported()) {
        // get the SystemTray instance
        SystemTray tray = SystemTray.getSystemTray();
        // load an image
        java.awt.Image image = null;
        image = Toolkit.getDefaultToolkit().getImage("icons\\iconify.png");

        stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent t) {
                hide(stage);
            }
        });

        // create a action listener to listen for default action executed on the tray icon
        final ActionListener closeListener = new ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent e) {
                stage.hide();

            }
        };

        ActionListener showListener = new ActionListener() {
            @Override
            public void actionPerformed(java.awt.event.ActionEvent e) {
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        stage.show();
                    }
                });
            }
        };
        // create a popup menu
        PopupMenu popup = new PopupMenu();

        MenuItem showItem = new MenuItem("Open app");

        showItem.addActionListener(showListener);
        popup.add(showItem);

        MenuItem closeItem = new MenuItem("Exit");
        closeItem.addActionListener(closeListener);
        popup.add(closeItem);
        /// ... add other items
        // construct a TrayIcon
        trayIcon = new TrayIcon(image, "Systray", popup);
        // set the TrayIcon properties
        trayIcon.addActionListener(showListener);
        // ...
        // add the tray image
        try {
            tray.add(trayIcon);
        } catch (AWTException e) {
            System.err.println(e);
        }
        // ...
    }
}
    public void showProgramIsMinimizedMsg() {
    //only in first time show the message
    if (firstTime) {
        trayIcon.displayMessage("System Tray",
                "Iconified",
                TrayIcon.MessageType.INFO);
        firstTime = false;
    }
}

        private void hide(final Stage stage) {
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            if (SystemTray.isSupported()) {
                stage.hide();
                showProgramIsMinimizedMsg();
            } else {
                 System.exit(0);
                System.out.println("Not Support Sys Tray");
            }
        }
    });
}
/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}

Und das ist mein Controller Klasse:

import java.net.URL;
import java.util.ResourceBundle;
import java.util.Timer;
import java.util.TimerTask;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.stage.Stage;
import org.controlsfx.control.Notifications;


public class FXMLDocumentController  implements Initializable   {

@FXML
private Label label;

@FXML
private void handleButtonAction(ActionEvent event) {
    Stage stage = (Stage) label.getScene().getWindow();
    stage.hide();
}

public void createNotification() {

    Notifications.create()
            .text("This is a Notification")
            .title("Notifications")
            .showInformation();
}

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

 Timer timer = new Timer();

    timer.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {
          Platform.runLater(()->createNotification());
        }

    }, 5000, 10000);
}

}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage