Anwendung aus SystemTray öffnen

OSchriever

Bekanntes Mitglied
Hi Freunde, ich habe ein Programm, welches ich im Hintergrund laufen lasse und als SystemTray-Symbol anzeigen lasse. Ich habe die Anwendung mit dem Scene Builder erstellt und kann über das Symbol die Anwendung schließen. Da sich hier AWT und JavaFX vermischt, ist das für mich als Anfänger etwas schwierig, aber ich habe es soweit fast am laufen, bis auf eine Sache:
Ich möchte die Anwendung per Doppelklick auf das System Tray Icon wieder öffnen. Dafür habe ich den ListenerTray programmiert. Ich weiß aber nicht mit welcher Anweisung ich das hinbekommen soll. Hat jemand eine Idee?

Vielen Dank

Hier der FXML Controller:


Java:
package de.schrieverkommt;


import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.TrayIcon.MessageType;
import java.awt.event.ActionListener;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Timer;
import java.util.TimerTask;
import com.sun.nio.sctp.Notification;

import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;




public class FXMLController {
    
    @FXML private CheckBox aktivBox;
    @FXML private Label letzteAkt;
    @FXML private Button ausfuehren;
    @FXML private Button anleitung;
    @FXML private Button info;
    @FXML private Button hintergrund;
    @FXML private Pane pane;
    
    TrayIcon trayIcon;
    
    @FXML protected void hintergrundKlick(ActionEvent event) {
        
        Stage stage =(Stage)pane.getScene().getWindow();
        stage.hide();
        
        
        if (SystemTray.isSupported()) {         
            SystemTray tray = SystemTray.getSystemTray();
            Image image = Toolkit.getDefaultToolkit().getImage("C:\\Users\\oschr\\Desktop\\aa.png");
            PopupMenu popup = new PopupMenu();
            MenuItem item = new MenuItem("Exit");

            popup.add(item);

           trayIcon = new TrayIcon(image, "Anomaly Refresh by Schriever kommt", popup);
          
            ActionListener listener = new ActionListener() {               
                @Override
                public void actionPerformed(java.awt.event.ActionEvent event) {
                    
                    
                    System.exit(0);                 
                }               
            };                       

            ActionListener listenerTray = new ActionListener() {               
                @Override
                public void actionPerformed(java.awt.event.ActionEvent arg0) {
                    
                                System.out.println("Doppelklick!!!");
                                
                }                   
            };           

            trayIcon.addActionListener(listenerTray);
            item.addActionListener(listener);

            try{
              tray.add(trayIcon);
              trayIcon.displayMessage("Anomaly Refresh", "Die App wird im Hintergrund ausgeführt.", MessageType.INFO);
            
            }catch (Exception e) {
              System.err.println("Can't add to tray");
            }
          } else {
            System.err.println("Tray unavailable");
          }
        
    }

        
    
     @FXML protected void anleitungKlick(ActionEvent event) {
        //den Dialog erzeugen und anzeigen
            Alert meinDialog = new Alert(AlertType.INFORMATION, "Setzen sie im Informationskästchen den Haken, um eine wöchentliche Erneuerung der Anomaly-Database zu aktivieren.\nDieser Vorgang wird durch anklicken des Buttons ->jetzt Ausführen<- manuell gestartet.\nDurch klicken des Buttons ->Hintergrundmodus<- bleibt das Programm fortlaufend aktiv. Um eine korrekte Funktion zu gewährleisten, darf das Programm nicht geschlossen werden.");
            
            meinDialog.setTitle("Anleitung");
            //den Text setzen
            meinDialog.setHeaderText("Bitte beachten sie die folgenden Schritte:");
            //den Dialog anzeigen
            meinDialog.showAndWait();
     }
    
     @FXML protected void infoKlick(ActionEvent event) {
            //den Dialog erzeugen und anzeigen
                Alert meinDialog = new Alert(AlertType.INFORMATION, "Version 1.1\n© Oliver Schriever, 06/2020");
                
                meinDialog.setTitle("Info");
                //den Text setzen
                meinDialog.setHeaderText("Anomaly Refresh by Schrieverkommt");
                //den Dialog anzeigen
                meinDialog.showAndWait();
         }
    

    
    @FXML protected void aktivKlick(ActionEvent event) {
            Timer timer = new Timer();
            timer.scheduleAtFixedRate(new TimerTask() {
                
                @Override
                public void run() {
                    if (aktivBox.isSelected()) {
                    programmAusfuehren();
                    }
                    else {
                        timer.cancel();
            }
                    }
            }, 6*1000, 6*1000);
            
        
    
        
    }
    private void notification() {
        trayIcon.displayMessage("Anomaly Refresh by Schrieverkommt", "Die Anomaly Database wurde erneuert", MessageType.INFO);
    }
    
    @FXML protected void ausfuehrenKlick(ActionEvent event) {
        programmAusfuehren();
        
        
        
    }
    
     private void datumSetzen() {
          LocalDate date = LocalDate.now();
         String aktDatum;
           DateTimeFormatter df;
            df = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);      // Sonntag, 31. Januar 2016
          
            aktDatum = date.format(df);
            letzteAkt.setText(aktDatum);
        }
    private void programmAusfuehren() {
        Path anomalyOld = Paths.get("C:\\Users\\oschr\\Desktop\\Anomaly old\\Anomaly.DB");
        Path anomalyNew = Paths.get("C:\\Users\\oschr\\Desktop\\Anomaly new\\Anomaly.DB");
        
        
        try {
            Files.copy(anomalyOld, anomalyNew, StandardCopyOption.REPLACE_EXISTING);
            
            System.out.println("Kopie wurde erstellt");
            datumSetzen();
        } catch (Exception e) {
            e.printStackTrace();
            
        }
        
    }
    
}
 

lam_tr

Top Contributor
Hier sogar ein lauffähiges Beispiel rauskopiert: https://stackoverflow.com/questions/12571329/javafx-app-in-system-tray

Code:
import java.awt.AWTException;
import java.awt.Image;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URL;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class MainApp2 extends Application {

int stateWindow = 1;

@Override
public void start(final Stage stage) throws Exception {

//Check the SystemTray is supported
if (!SystemTray.isSupported()) {
    System.out.println("SystemTray is not supported");
    return;
}

URL url = System.class.getResource("/image/yourImage.png");
Image image = Toolkit.getDefaultToolkit().getImage(url);

//image dimensions must be 16x16 on windows, works for me
final TrayIcon trayIcon = new TrayIcon(image, "application name");

final SystemTray tray = SystemTray.getSystemTray();

//Listener left clic XD
trayIcon.addMouseListener(new MouseAdapter() {
    @Override
    public void mouseClicked(MouseEvent event) {
        if (event.getButton() == MouseEvent.BUTTON1) {
            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    if (stateWindow == 1) {
                        stage.hide();
                        stateWindow = 0;
                    } else if (stateWindow == 0) {
                        stage.show();
                        stateWindow = 1;
                    }
                }
            });
        }

    }
});

try {
    tray.add(trayIcon);
} catch (AWTException e) {
    System.out.println("TrayIcon could not be added.");
}

stage.setTitle("Hello man!");
Button btn = new Button();
btn.setText("Say 'Hello man'");
btn.setOnAction(new EventHandler<ActionEvent>() {

    @Override
    public void handle(ActionEvent event) {
        System.out.println("Hello man!");
    }
});
StackPane root = new StackPane();
root.getChildren().add(btn);
stage.setScene(new Scene(root, 300, 250));
Platform.setImplicitExit(false);
stage.show();

}

/**
 * The main() method is ignored in correctly deployed JavaFX application.
 * main() serves only as fallback in case the application can not be
 * launched through deployment artifacts, e.g., in IDEs with limited FX
 * support. NetBeans ignores main().
 *
 * @param args the command line arguments
 */
public static void main(String[] args) {
launch(args);
}
}
 

OSchriever

Bekanntes Mitglied
Ich habe den MouseListener bei mir eingefügt, passiert auch nichts wenn man auf das Icon klickt. Hier der geänderte Code.
Irgendwie hat das noch nichts gebracht.


Java:
package de.schrieverkommt;


import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.TrayIcon.MessageType;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Timer;
import java.util.TimerTask;
import com.sun.nio.sctp.Notification;

import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;




public class FXMLController {
    
    @FXML private CheckBox aktivBox;
    @FXML private Label letzteAkt;
    @FXML private Button ausfuehren;
    @FXML private Button anleitung;
    @FXML private Button info;
    @FXML private Button hintergrund;
    @FXML private Pane pane;
    
    TrayIcon trayIcon;
    int stateWindow = 0;
    
    @FXML protected void hintergrundKlick(ActionEvent event) {
        
        Stage stage =(Stage)pane.getScene().getWindow();
        stage.hide();
        
        
        if (SystemTray.isSupported()) {         
            SystemTray tray = SystemTray.getSystemTray();
            Image image = Toolkit.getDefaultToolkit().getImage("C:\\Users\\oschr\\Desktop\\aa.png");
            PopupMenu popup = new PopupMenu();
            MenuItem item = new MenuItem("Exit");

            popup.add(item);

           trayIcon = new TrayIcon(image, "Anomaly Refresh by Schriever kommt", popup);
          
            ActionListener listener = new ActionListener() {               
                @Override
                public void actionPerformed(java.awt.event.ActionEvent event) {
                    
                    
                    System.exit(0);                 
                }               
            };
            
            
            

            trayIcon.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent event) {
                    if (event.getButton() == MouseEvent.BUTTON1) {
                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                if (stateWindow == 1) {
                                    stage.hide();
                                    stateWindow = 0;
                                } else if (stateWindow == 0) {
                                    stage.show();
                                    stateWindow = 1;
                                }
                            }
                        });
                    }

                }
            });
            
        
//            ActionListener listenerTray = new ActionListener() {               
//                @Override
//                public void actionPerformed(java.awt.event.ActionEvent arg0) {
//                   
//                                System.out.println("Doppelklick!!!");
//                               
//                }                   
//            };           

//            trayIcon.addActionListener(listenerTray);
            item.addActionListener(listener);

            try{
              tray.add(trayIcon);
              trayIcon.displayMessage("Anomaly Refresh", "Die App wird im Hintergrund ausgeführt.", MessageType.INFO);
            
            }catch (Exception e) {
              System.err.println("Can't add to tray");
            }
          } else {
            System.err.println("Tray unavailable");
          }
        
    
    
    
    
    
    }
    
    
    
    
    
    
    
    
    
    
    
    

        
    
     @FXML protected void anleitungKlick(ActionEvent event) {
        //den Dialog erzeugen und anzeigen
            Alert meinDialog = new Alert(AlertType.INFORMATION, "Setzen sie im Informationskästchen den Haken, um eine wöchentliche Erneuerung der Anomaly-Database zu aktivieren.\nDieser Vorgang wird durch anklicken des Buttons ->jetzt Ausführen<- manuell gestartet.\nDurch klicken des Buttons ->Hintergrundmodus<- bleibt das Programm fortlaufend aktiv. Um eine korrekte Funktion zu gewährleisten, darf das Programm nicht geschlossen werden.");
            
            meinDialog.setTitle("Anleitung");
            //den Text setzen
            meinDialog.setHeaderText("Bitte beachten sie die folgenden Schritte:");
            //den Dialog anzeigen
            meinDialog.showAndWait();
     }
    
     @FXML protected void infoKlick(ActionEvent event) {
            //den Dialog erzeugen und anzeigen
                Alert meinDialog = new Alert(AlertType.INFORMATION, "Version 1.1\n© Oliver Schriever, 06/2020");
                
                meinDialog.setTitle("Info");
                //den Text setzen
                meinDialog.setHeaderText("Anomaly Refresh by Schrieverkommt");
                //den Dialog anzeigen
                meinDialog.showAndWait();
         }
    

    
    @FXML protected void aktivKlick(ActionEvent event) {
            Timer timer = new Timer();
            timer.scheduleAtFixedRate(new TimerTask() {
                
                @Override
                public void run() {
                    if (aktivBox.isSelected()) {
                    programmAusfuehren();
                    }
                    else {
                        timer.cancel();
            }
                    }
            }, 6*1000, 6*1000);
            
        
    
        
    }
    private void notification() {
        trayIcon.displayMessage("Anomaly Refresh by Schrieverkommt", "Die Anomaly Database wurde erneuert", MessageType.INFO);
    }
    
    @FXML protected void ausfuehrenKlick(ActionEvent event) {
        programmAusfuehren();
        
        
        
    }
    
     private void datumSetzen() {
          LocalDate date = LocalDate.now();
         String aktDatum;
           DateTimeFormatter df;
            df = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);      // Sonntag, 31. Januar 2016
          
            aktDatum = date.format(df);
            letzteAkt.setText(aktDatum);
        }
    private void programmAusfuehren() {
        Path anomalyOld = Paths.get("C:\\Users\\oschr\\Desktop\\Anomaly old\\Anomaly.DB");
        Path anomalyNew = Paths.get("C:\\Users\\oschr\\Desktop\\Anomaly new\\Anomaly.DB");
        
        
        try {
            Files.copy(anomalyOld, anomalyNew, StandardCopyOption.REPLACE_EXISTING);
            
            System.out.println("Kopie wurde erstellt");
            datumSetzen();
        } catch (Exception e) {
            e.printStackTrace();
            
        }
        
    }
    
}

Platform.runLater(e-> stage.show()) habe ich vorher auch schon probiert. Kann es was damit zu tun haben, dass ich mich ja in der Controller-Klasse befinde? Die Beispiele arbeiten ja alle aus der Main-Klasse heraus.
Aber ich wüsste nicht, wie ich das in die Main-Klasse programmieren soll.
Da ich noch Anfänger bin, brauche ich leider etwas Rückenwind. :)
Vielen Dank
 

lam_tr

Top Contributor
Ich habe den MouseListener bei mir eingefügt, passiert auch nichts wenn man auf das Icon klickt. Hier der geänderte Code.
Irgendwie hat das noch nichts gebracht.


Java:
package de.schrieverkommt;


import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.TrayIcon.MessageType;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Timer;
import java.util.TimerTask;
import com.sun.nio.sctp.Notification;

import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;




public class FXMLController {
   
    @FXML private CheckBox aktivBox;
    @FXML private Label letzteAkt;
    @FXML private Button ausfuehren;
    @FXML private Button anleitung;
    @FXML private Button info;
    @FXML private Button hintergrund;
    @FXML private Pane pane;
   
    TrayIcon trayIcon;
    int stateWindow = 0;
   
    @FXML protected void hintergrundKlick(ActionEvent event) {
       
        Stage stage =(Stage)pane.getScene().getWindow();
        stage.hide();
       
       
        if (SystemTray.isSupported()) {        
            SystemTray tray = SystemTray.getSystemTray();
            Image image = Toolkit.getDefaultToolkit().getImage("C:\\Users\\oschr\\Desktop\\aa.png");
            PopupMenu popup = new PopupMenu();
            MenuItem item = new MenuItem("Exit");

            popup.add(item);

           trayIcon = new TrayIcon(image, "Anomaly Refresh by Schriever kommt", popup);
         
            ActionListener listener = new ActionListener() {              
                @Override
                public void actionPerformed(java.awt.event.ActionEvent event) {
                   
                   
                    System.exit(0);                
                }              
            };
           
           
           

            trayIcon.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent event) {
                    if (event.getButton() == MouseEvent.BUTTON1) {
                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                if (stateWindow == 1) {
                                    stage.hide();
                                    stateWindow = 0;
                                } else if (stateWindow == 0) {
                                    stage.show();
                                    stateWindow = 1;
                                }
                            }
                        });
                    }

                }
            });
           
       
//            ActionListener listenerTray = new ActionListener() {              
//                @Override
//                public void actionPerformed(java.awt.event.ActionEvent arg0) {
//                  
//                                System.out.println("Doppelklick!!!");
//                              
//                }                  
//            };          

//            trayIcon.addActionListener(listenerTray);
            item.addActionListener(listener);

            try{
              tray.add(trayIcon);
              trayIcon.displayMessage("Anomaly Refresh", "Die App wird im Hintergrund ausgeführt.", MessageType.INFO);
           
            }catch (Exception e) {
              System.err.println("Can't add to tray");
            }
          } else {
            System.err.println("Tray unavailable");
          }
       
   
   
   
   
   
    }
   
   
   
   
   
   
   
   
   
   
   
   

       
   
     @FXML protected void anleitungKlick(ActionEvent event) {
        //den Dialog erzeugen und anzeigen
            Alert meinDialog = new Alert(AlertType.INFORMATION, "Setzen sie im Informationskästchen den Haken, um eine wöchentliche Erneuerung der Anomaly-Database zu aktivieren.\nDieser Vorgang wird durch anklicken des Buttons ->jetzt Ausführen<- manuell gestartet.\nDurch klicken des Buttons ->Hintergrundmodus<- bleibt das Programm fortlaufend aktiv. Um eine korrekte Funktion zu gewährleisten, darf das Programm nicht geschlossen werden.");
           
            meinDialog.setTitle("Anleitung");
            //den Text setzen
            meinDialog.setHeaderText("Bitte beachten sie die folgenden Schritte:");
            //den Dialog anzeigen
            meinDialog.showAndWait();
     }
   
     @FXML protected void infoKlick(ActionEvent event) {
            //den Dialog erzeugen und anzeigen
                Alert meinDialog = new Alert(AlertType.INFORMATION, "Version 1.1\n© Oliver Schriever, 06/2020");
               
                meinDialog.setTitle("Info");
                //den Text setzen
                meinDialog.setHeaderText("Anomaly Refresh by Schrieverkommt");
                //den Dialog anzeigen
                meinDialog.showAndWait();
         }
   

   
    @FXML protected void aktivKlick(ActionEvent event) {
            Timer timer = new Timer();
            timer.scheduleAtFixedRate(new TimerTask() {
               
                @Override
                public void run() {
                    if (aktivBox.isSelected()) {
                    programmAusfuehren();
                    }
                    else {
                        timer.cancel();
            }
                    }
            }, 6*1000, 6*1000);
           
       
   
       
    }
    private void notification() {
        trayIcon.displayMessage("Anomaly Refresh by Schrieverkommt", "Die Anomaly Database wurde erneuert", MessageType.INFO);
    }
   
    @FXML protected void ausfuehrenKlick(ActionEvent event) {
        programmAusfuehren();
       
       
       
    }
   
     private void datumSetzen() {
          LocalDate date = LocalDate.now();
         String aktDatum;
           DateTimeFormatter df;
            df = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);      // Sonntag, 31. Januar 2016
         
            aktDatum = date.format(df);
            letzteAkt.setText(aktDatum);
        }
    private void programmAusfuehren() {
        Path anomalyOld = Paths.get("C:\\Users\\oschr\\Desktop\\Anomaly old\\Anomaly.DB");
        Path anomalyNew = Paths.get("C:\\Users\\oschr\\Desktop\\Anomaly new\\Anomaly.DB");
       
       
        try {
            Files.copy(anomalyOld, anomalyNew, StandardCopyOption.REPLACE_EXISTING);
           
            System.out.println("Kopie wurde erstellt");
            datumSetzen();
        } catch (Exception e) {
            e.printStackTrace();
           
        }
       
    }
   
}

Platform.runLater(e-> stage.show()) habe ich vorher auch schon probiert. Kann es was damit zu tun haben, dass ich mich ja in der Controller-Klasse befinde? Die Beispiele arbeiten ja alle aus der Main-Klasse heraus.
Aber ich wüsste nicht, wie ich das in die Main-Klasse programmieren soll.
Da ich noch Anfänger bin, brauche ich leider etwas Rückenwind. :)
Vielen Dank


Kommst du in diese Methode überhaupt rein wenn du den TrayIcon anklickst? Debug mal darein

Code:
trayIcon.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent event) {
                    if (event.getButton() == MouseEvent.BUTTON1) {
                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                if (stateWindow == 1) {
                                    stage.hide();
                                    stateWindow = 0;
                                } else if (stateWindow == 0) {
                                    stage.show();
                                    stateWindow = 1;
                                }
                            }
                        });
                    }

                }
            });
 

OSchriever

Bekanntes Mitglied
Jupp hab ich angepasst und auch die Größe vom Bild auf 16x16 gesetzt. Hab trotzdem nen Fehler in der Zeile 33:
at java.desktop/sun.awt.SunToolkit.getImage(Unknown Source)
at Main.start(Main.java:33)

Dann versuche ich es nachher mal mit dem Debugger.
 
K

kneitzel

Gast
Was hast Du denn da angegeben? Du hast gesehen, dass er System.class.getResource aufruft, d.h. er geht über den Classloader. Also mit Deiner Angabe ganzer Pfade kann er da nichts laden!

Die Bilder gehören als Ressource ins Projekt und dann müssen diese entsprechend geladen werden.
 

lam_tr

Top Contributor
Für alle die an das Problem interessiert sind. Wir haben es gelöst.

Damit die Anwendung nicht wirklick komplett geschlossen wird, muss in der Application Klasse Platform.setImplicitExit(false); aufgerufen werden.
 

OSchriever

Bekanntes Mitglied
Hi, alles läuft gut, jedoch werden die Bilder nach dem Exportieren nicht angezeigt. Da habe ich 1x ein Bild(Firmenlogo) das ich im SceneBuilder eingefügt habe und dort auch die Url angegeben habe. Im Bereich Code habe ich nichts weiter eingegeben(siehe Screenshot).
Dann habe ich noch das Icon im SystemTray. Beide Bilder sind in einem Ordner Icons im Projekt. Ich füge hier nochmal den Code an sowie ein paar Screenshots.
Vielleicht hat ja jemand eine Idee wo das dran liegen könnte...
LG



Anmerkung 2020-06-28 204906.jpgAnmerkung 2020-06-28 204925.jpg Anmerkung 2020-06-28 204830.jpg


Java:
package de.schrieverkommt;

import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.TrayIcon.MessageType;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Timer;
import java.util.TimerTask;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class FXMLController {

    @FXML
    private CheckBox aktivBox;
    @FXML
    private Label letzteAkt;
    @FXML
    private Button ausfuehren;
    @FXML
    private Button anleitung;
    @FXML
    private Button info;
    @FXML
    private Button hintergrund;
    @FXML
    private Pane pane;
    
    TrayIcon trayIcon;
    int stateWindow = 0;
    
    @FXML
    protected void hintergrundKlick(ActionEvent event) {
        //Die Stage der Mainklasse holen
        Stage stage = (Stage) pane.getScene().getWindow();
        //Die Applikation in den Hintergrund setzen
        stage.hide();
        //Das Symbol im Systemtray
        if (SystemTray.isSupported()) {
            SystemTray tray = SystemTray.getSystemTray();
            Image image = Toolkit.getDefaultToolkit().getImage("icons/icon.png");
            PopupMenu popup = new PopupMenu();
            //Schließen-Symbol setzen
            MenuItem item = new MenuItem("Exit");
            
            popup.add(item);
            //Popup-Text setzen
            trayIcon = new TrayIcon(image, "Anomaly Refresh by Schriever kommt", popup);

            ActionListener listener = new ActionListener() {
                
                //Der Listener zum Schließen der Anwendung
                @Override
                public void actionPerformed(java.awt.event.ActionEvent event) {

                    System.exit(0);
                }
            };
            //Der Listener zum Anzeigen/Verstecken bei Klick auf das System-Tray Symbol
            trayIcon.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent event) {
                    if (event.getButton() == MouseEvent.BUTTON1) {
                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                if (stateWindow == 1) {
                                    stage.hide();
                                    stateWindow = 0;
                                } else if (stateWindow == 0) {
                                    stage.show();
                                    stateWindow = 1;
                                }
                            }
                        });
                    }

                }
            });

            item.addActionListener(listener);

            try {
                tray.add(trayIcon);
                trayIcon.displayMessage("Anomaly Refresh", "Die App wird im Hintergrund ausgeführt.", MessageType.INFO);

            } catch (Exception e) {
                System.err.println("Can't add to tray");
            }
        } else {
            System.err.println("Tray unavailable");
        }

    }
    //Die Anleitung anzeigen
    @FXML
    protected void anleitungKlick(ActionEvent event) {
        // den Dialog erzeugen und anzeigen
        Alert meinDialog = new Alert(AlertType.INFORMATION,
                "Setzen sie im Informationskästchen den Haken, um eine wöchentliche Erneuerung der Anomaly-Database zu aktivieren.\nDieser Vorgang wird durch anklicken des Buttons ->jetzt Ausführen<- manuell gestartet.\nDurch klicken des Buttons ->Hintergrundmodus<- bleibt das Programm fortlaufend aktiv. Um eine korrekte Funktion zu gewährleisten, darf das Programm nicht geschlossen werden.");

        meinDialog.setTitle("Anleitung");
        // den Text setzen
        meinDialog.setHeaderText("Bitte beachten sie die folgenden Schritte:");
        // den Dialog anzeigen
        meinDialog.showAndWait();
    }
    //Die Informationen anzeigen
    @FXML
    protected void infoKlick(ActionEvent event) {
        // den Dialog erzeugen und anzeigen
        Alert meinDialog = new Alert(AlertType.INFORMATION, "Version 1.1\n© Oliver Schriever, 06/2020");

        meinDialog.setTitle("Info");
        // den Text setzen
        meinDialog.setHeaderText("Anomaly Refresh by Schrieverkommt");
        // den Dialog anzeigen
        meinDialog.showAndWait();
    }
    
    //Das Zeit-Programm laufen lassen
    @FXML
    protected void aktivKlick(ActionEvent event) {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                if (aktivBox.isSelected()) {
                    programmAusfuehren();
                    notification();
                } else {
                    timer.cancel();
                }
            }
            //Die Verzögerungszeit sowie die Intervallzeit für das Starten der Anwendung in Milisekunden. Hier 1 Monat
        }, 2628 * 1000, 2628 * 1000);

    }
    //Benachrichtigung wenn die Database erneuert wurde
    private void notification() {
        trayIcon.displayMessage("Anomaly Refresh by Schrieverkommt", "Die Anomaly Database wurde erneuert",
                MessageType.INFO);
    }
    //Button Ausführen wurde geklickt
    @FXML
    protected void ausfuehrenKlick(ActionEvent event) {
        programmAusfuehren();

    }
    //Das Datum der letzten Ausführung im Label setzen
    private void datumSetzen() {
        LocalDate date = LocalDate.now();
        String aktDatum;
        DateTimeFormatter df;
        df = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL); // Sonntag, 31. Januar 2016

        aktDatum = date.format(df);
        letzteAkt.setText(aktDatum);
    }
    //Das Kopieren der Dateien
    private void programmAusfuehren() {
        Path anomalyOld = Paths.get("C:\\Program Files\\Dairymaster\\Dmmwin\\Data\\Anomaly.DB");
        Path anomalyNew = Paths.get("C:\\Program Files\\Dairymaster\\Schriever kommt\\Anomaly new\\Anomaly.DB");
        
        //Die Datei wird ersetzt!
        try {
            Files.copy(anomalyNew, anomalyOld, StandardCopyOption.REPLACE_EXISTING);

            
            datumSetzen();
        } catch (Exception e) {
            
            Alert meinDialog = new Alert(AlertType.ERROR,e.toString());
                    

            meinDialog.setTitle("Fehler!");
            // den Text setzen
            meinDialog.setHeaderText("Die Datenbank wurde nicht gefunden:");
            // den Dialog anzeigen
            meinDialog.showAndWait();
            
            
            

        }

    }

}
Java:
package de.schrieverkommt;


import javafx.application.Application;
import javafx.application.Platform;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;


public class Main extends Application {

    
    @Override
    public void start(Stage meineStage) throws Exception {
        
        Parent root = FXMLLoader.load(getClass().getResource("sb_AnomalyRefresh.fxml"));
        
        
        
        Scene meineScene = new Scene(root, 656, 500);
        
        //den Titel über stage setzen
        meineStage.setTitle("Anomaly Refresh by Schrieverkommt");
        
        
        //die Szene setzen
        meineStage.setScene(meineScene);
        //Muss gesetzt werden, da die Anwendung nur versteckt werden soll, kann sonst mit der Anweisung stage.show() nicht wieder geholt werden
        Platform.setImplicitExit(false);
        
        meineStage.show();
        
    }
    
    
    

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

        
        


    }
    

    

}
 

lam_tr

Top Contributor
Ich vermute mal dass diese Icons beim Exportieren nicht mit geliefert sind. Das kannst du sehr schnell testen indem du die Jar exportierst und danach suchst.
 
K

kneitzel

Gast
Wie lädst Du das Image? Ist es diese Zeile:
Image image = Toolkit.getDefaultToolkit().getImage("icons/icon.png");

Das Toolkit will eine Datei laden. Das ist also kein laden einer Ressource aus dem jar (So wie ich das Verstehe. Siehe: https://docs.oracle.com/javase/9/docs/api/java/awt/Toolkit.html#getImage-java.lang.String-)

Daher solltest Du ggf. explizit die Ressource laden. Dazu könnte ein Code wie:
Image image = Toolkit.getDefaultToolkit().getImage(getClass.getResource("/icons/icon.png"));
brauchbar sein.

Aber auch hier ist dann wichtig: Gib das icon absolut an, wie es auf dem Classpath zu finden ist!

Edit: Aber ich muss auch ehrlich zugeben, dass mir das mit der Auswahl in der GUI nicht ganz verständlich wird. Das wäre dann ja auch nur eine Auswahl im Filesystem und nicht im Jar ...
 

lam_tr

Top Contributor
Wie lädst Du das Image? Ist es diese Zeile:
Image image = Toolkit.getDefaultToolkit().getImage("icons/icon.png");

Das Toolkit will eine Datei laden. Das ist also kein laden einer Ressource aus dem jar (So wie ich das Verstehe. Siehe: https://docs.oracle.com/javase/9/docs/api/java/awt/Toolkit.html#getImage-java.lang.String-)

Daher solltest Du ggf. explizit die Ressource laden. Dazu könnte ein Code wie:
Image image = Toolkit.getDefaultToolkit().getImage(getClass.getResource("/icons/icon.png"));
brauchbar sein.

Aber auch hier ist dann wichtig: Gib das icon absolut an, wie es auf dem Classpath zu finden ist!

Edit: Aber ich muss auch ehrlich zugeben, dass mir das mit der Auswahl in der GUI nicht ganz verständlich wird. Das wäre dann ja auch nur eine Auswahl im Filesystem und nicht im Jar ...
Es geht hier mehr um die Image die im FXML definiert ist. Das Iconsverzeichnis liegt im Classpath von daher kann man dann direkt /icons/logo.jpg daraufzugreifen.
 

OSchriever

Bekanntes Mitglied
Wie lädst Du das Image? Ist es diese Zeile:
Image image = Toolkit.getDefaultToolkit().getImage("icons/icon.png");
Jupp genau.
Daher solltest Du ggf. explizit die Ressource laden. Dazu könnte ein Code wie:
Image image = Toolkit.getDefaultToolkit().getImage(getClass.getResource("/icons/icon.png"));
brauchbar sein.
Dann kann er mit getClass.getResource nichts anfangen.
Edit: Aber ich muss auch ehrlich zugeben, dass mir das mit der Auswahl in der GUI nicht ganz verständlich wird. Das wäre dann ja auch nur eine Auswahl im Filesystem und nicht im Jar ...
Wie meinst du das? 🧐
 

OSchriever

Bekanntes Mitglied
Versuche in der fxml nicht das Icon Verzeichnis nicht mit ../../../logo.png zu machen, stattdessen /icons/logo.png
Das funktioniert nicht, dann findet er das Bild im Scenebuilder nicht mehr. Selbst wenn ich das im SB manuell so ändere, dann wird der Pfad vom SB wieder auf das ursprüngliche geändert. Wenn ich das dann in der FXML ändere dann findet er das Bild nicht mehr...
 
K

kneitzel

Gast
Bei getClass fehlten die Klammern ... das ist natürlich eine Methode. Das ist halt blöd, wenn man so Code direkt im Forum schreibt.
 

OSchriever

Bekanntes Mitglied
Also ich möchte auch nochmalk anmerken, dass beide Bilder nach dem Exportieren nicht mehr angezeigt werden. Im Run über Eclipse funktioniert das alles. Und ich habe den Pfad des Logos ja auch im Scenebuilder angegeben. Ich verstehe nicht warum es dann nicht mehr übernommen wird...
 
K

kneitzel

Gast
Da haut er mir Exceptions raus.

Das mach ich doch mit icons/icon.png oder?
Nein, das ist relativ. Absolut wäre mit dem führenden /!

Und du musst es natürlich genau so angeben, wie die Datei heißt incl. Beachtung der Gross-/Kleinschreibung.

Im Code hast Du geschrieben: "icons/icon.png" (bzw. absolut würde es "/icons/icon.png"), aber das Bildschirmfoto in #14 zeigt lediglich ein
- icon1.png
- logo.png

Somit gibt es kein icon.png und damit kann er es auch nicht laden.
 

OSchriever

Bekanntes Mitglied
Wenn ich den Pfad absolut angebe, und dann über Run den Code ausführe, dann sind die Bilder weg. Also werden dann nicht mehr angezeigt.
Warum da icon1 angezeigt wurde, weiß ich jetzt nicht. Komischerweise werden die Bilder jetzt gar nicht mehr angezeigt wenn ich das Programm exportiere... 🤨
Ich habe vorher auch schon ein Programm so erstellt wie ich das jetzt gemacht habe, da wird mir das Bild auch angezeigt, also das Logo. Da hatte ich kein SystemTray. Merkwürdig ist aber, dass auch da das Logo jetzt auch nicht mehr angezeigt wird wenn ich das Programm exportiere...
 
K

kneitzel

Gast
Dann zeig doch noch einmal Deinenen Code wie Du die Bilder nun versuchst zu laden und zeig den Inhalt der jar Datei (jar -tf file.jar gibt eine Liste der Dateien aus...)
 

OSchriever

Bekanntes Mitglied
Java:
package de.schrieverkommt;

import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.TrayIcon.MessageType;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Timer;
import java.util.TimerTask;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class FXMLController {

    @FXML
    private CheckBox aktivBox;
    @FXML
    private Label letzteAkt;
    @FXML
    private Button ausfuehren;
    @FXML
    private Button anleitung;
    @FXML
    private Button info;
    @FXML
    private Button hintergrund;
    @FXML
    private Pane pane;
    
    TrayIcon trayIcon;
    int stateWindow = 0;
    
    
    
    
    //Den Hintergrundmodus aktivieren
    @FXML
    protected void hintergrundKlick(ActionEvent event) {
        //Die Stage der Mainklasse holen
        Stage stage = (Stage) pane.getScene().getWindow();
        //Die Applikation in den Hintergrund setzen
        stage.hide();
        //Das Symbol im Systemtray
        if (SystemTray.isSupported()) {
            SystemTray tray = SystemTray.getSystemTray();
            Image image = Toolkit.getDefaultToolkit().getImage(getClass().getResource("/icons/icon.png"));
            //Image image = Toolkit.getDefaultToolkit().getImage("/icons/icon1.png");
            PopupMenu popup = new PopupMenu();
            //Schließen-Symbol setzen
            MenuItem item = new MenuItem("Exit");
            
            popup.add(item);
            //Popup-Text setzen
            trayIcon = new TrayIcon(image, "Anomaly Refresh by Schriever kommt", popup);

            ActionListener listener = new ActionListener() {
                
                //Der Listener zum Schließen der Anwendung
                @Override
                public void actionPerformed(java.awt.event.ActionEvent event) {

                    System.exit(0);
                }
            };
            //Der Listener zum Anzeigen/Verstecken bei Klick auf das System-Tray Symbol
            trayIcon.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent event) {
                    if (event.getButton() == MouseEvent.BUTTON1) {
                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                if (stateWindow == 1) {
                                    stage.hide();
                                    stateWindow = 0;
                                } else if (stateWindow == 0) {
                                    stage.show();
                                    stateWindow = 1;
                                }
                            }
                        });
                    }

                }
            });

            item.addActionListener(listener);

            try {
                tray.add(trayIcon);
                trayIcon.displayMessage("Anomaly Refresh", "Die App wird im Hintergrund ausgeführt.", MessageType.INFO);

            } catch (Exception e) {
                System.err.println("Can't add to tray");
            }
        } else {
            System.err.println("Tray unavailable");
        }

    }
    //Die Anleitung anzeigen
    @FXML
    protected void anleitungKlick(ActionEvent event) {
        // den Dialog erzeugen und anzeigen
        Alert meinDialog = new Alert(AlertType.INFORMATION,
                "Setzen sie im Informationskästchen den Haken, um eine wöchentliche Erneuerung der Anomaly-Database zu aktivieren.\nDieser Vorgang wird durch anklicken des Buttons ->jetzt Ausführen<- manuell gestartet.\nDurch klicken des Buttons ->Hintergrundmodus<- bleibt das Programm fortlaufend aktiv. Um eine korrekte Funktion zu gewährleisten, darf das Programm nicht geschlossen werden.");

        meinDialog.setTitle("Anleitung");
        // den Text setzen
        meinDialog.setHeaderText("Bitte beachten sie die folgenden Schritte:");
        // den Dialog anzeigen
        meinDialog.showAndWait();
    }
    //Die Informationen anzeigen
    @FXML
    protected void infoKlick(ActionEvent event) {
        // den Dialog erzeugen und anzeigen
        Alert meinDialog = new Alert(AlertType.INFORMATION, "Version 1.1\n© Oliver Schriever, 06/2020");

        meinDialog.setTitle("Info");
        // den Text setzen
        meinDialog.setHeaderText("Anomaly Refresh by Schrieverkommt");
        // den Dialog anzeigen
        meinDialog.showAndWait();
    }
    
    //Das Zeit-Programm laufen lassen
    @FXML
    protected void aktivKlick(ActionEvent event) {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                if (aktivBox.isSelected()) {
                    programmAusfuehren();
                    notification();
                } else {
                    timer.cancel();
                }
            }
            //Die Verzögerungszeit sowie die Intervallzeit für das Starten der Anwendung in Milisekunden. Hier 1 Monat
        }, 2628 * 1000, 2628 * 1000);

    }
    //Benachrichtigung wenn die Database erneuert wurde
    private void notification() {
        trayIcon.displayMessage("Anomaly Refresh by Schrieverkommt", "Die Anomaly Database wurde erneuert",
                MessageType.INFO);
    }
    //Button Ausführen wurde geklickt
    @FXML
    protected void ausfuehrenKlick(ActionEvent event) {
        programmAusfuehren();

    }
    //Das Datum der letzten Ausführung im Label setzen
    private void datumSetzen() {
        LocalDate date = LocalDate.now();
        String aktDatum;
        DateTimeFormatter df;
        df = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);

        aktDatum = date.format(df);
        letzteAkt.setText(aktDatum);
    }
    //Das Kopieren der Dateien
    private void programmAusfuehren() {
        Path anomalyOld = Paths.get("C:\\Program Files\\Dairymaster\\Dmmwin\\Data\\Anomaly.DB");
        Path anomalyNew = Paths.get("C:\\Program Files\\Dairymaster\\Schriever kommt\\Anomaly new\\Anomaly.DB");
        
        //Die Datei wird ersetzt!
        try {
            Files.copy(anomalyNew, anomalyOld, StandardCopyOption.REPLACE_EXISTING);

            
            datumSetzen();
        } catch (Exception e) {
            
            Alert meinDialog = new Alert(AlertType.ERROR,e.toString());
                    

            meinDialog.setTitle("Fehler!");
            // den Text setzen
            meinDialog.setHeaderText("Die Datenbank wurde nicht gefunden:");
            // den Dialog anzeigen
            meinDialog.showAndWait();
            
            
            

        }

    }

}

Wenn ich dann den Hintergrundmodus aktiviere, dann haut er Fehler raus...
 

OSchriever

Bekanntes Mitglied
Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at javafx.fxml/javafx.fxml.FXMLLoader$MethodHandler.invoke(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(Unknown Source)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at javafx.base/javafx.event.Event.fireEvent(Unknown Source)
at javafx.graphics/javafx.scene.Node.fireEvent(Unknown Source)
at javafx.controls/javafx.scene.control.Button.fire(Unknown Source)
at javafx.controls/com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(Unknown Source)
at javafx.controls/com.sun.javafx.scene.control.inputmap.InputMap.handle(Unknown Source)
at javafx.base/com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(Unknown Source)
at javafx.base/com.sun.javafx.event.EventUtil.fireEventImpl(Unknown Source)
at javafx.base/com.sun.javafx.event.EventUtil.fireEvent(Unknown Source)
at javafx.base/javafx.event.Event.fireEvent(Unknown Source)
at javafx.graphics/javafx.scene.Scene$MouseHandler.process(Unknown Source)
at javafx.graphics/javafx.scene.Scene$MouseHandler.access$1300(Unknown Source)
at javafx.graphics/javafx.scene.Scene.processMouseEvent(Unknown Source)
at javafx.graphics/javafx.scene.Scene$ScenePeerListener.mouseEvent(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$2(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(Unknown Source)
at javafx.graphics/com.sun.glass.ui.View.handleMouseEvent(Unknown Source)
at javafx.graphics/com.sun.glass.ui.View.notifyMouse(Unknown Source)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javafx.reflect.Trampoline.invoke(Unknown Source)
at jdk.internal.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.base/java.lang.reflect.Method.invoke(Unknown Source)
at javafx.base/com.sun.javafx.reflect.MethodUtil.invoke(Unknown Source)
at javafx.fxml/com.sun.javafx.fxml.MethodHelper.invoke(Unknown Source)
... 48 more
Caused by: java.lang.NullPointerException
at java.desktop/sun.awt.SunToolkit.getImageFromHash(Unknown Source)
at java.desktop/sun.awt.SunToolkit.getImage(Unknown Source)
at de.schrieverkommt.FXMLController.hintergrundKlick(FXMLController.java:78)
... 58 more

Das Bild "logo" hat er drin, das Problem besteht nur noch beim zugreifen auf das icon. :(
 

OSchriever

Bekanntes Mitglied
Was für Fehler? Wäre hilfreich, wenn Du die auch im Detail nennen könntest.

Hi, ich muss mich entschuldigen.
Ich hatte da irgendwie einen Dreher mit icon und icon1, so wie das wahrscheinlich von dir schon vermutet war. 🙈
Alles läuft Prima, habe nur den Namen von icon1 auf icon geändert.
Da hättet ihr lange grübeln können, die Dummheit anderer könnt ihr nicht beheben. 😂

Ich möchte mich recht herzlich bei euch bedanken, dass ihr euch die Zeit genommen und mir so tatkräftig weiter geholfen habt.

Schönes Wochenende 😀
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
MiMa Fonts, Icons, Bilder in JavaFX Anwendung AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
P Swing Anwendung von LayeredPanel AWT, Swing, JavaFX & SWT 6
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
thor_norsk JavaFX Anwendung stürzt ab AWT, Swing, JavaFX & SWT 4
H Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen AWT, Swing, JavaFX & SWT 44
G JavaFX Steuerung bzw. Test von externer JavaFX Anwendung (liegt nur als jar vor) AWT, Swing, JavaFX & SWT 9
N JavaFX Vor beenden der Anwendung durch klicken von X Dialog zeigen AWT, Swing, JavaFX & SWT 1
beli3ver JavaFX Anwendung startet nicht, kann den Fehler nicht finden (Exception in Application start method) AWT, Swing, JavaFX & SWT 1
B JavaFX Wie A4-Seite in meiner Anwendung repräsentieren AWT, Swing, JavaFX & SWT 6
B JavaFX JavaFX Anwendung deployen (entw als runnableJAR oder exe-Datei) AWT, Swing, JavaFX & SWT 15
G JavaFX SplitPane Anwendung - Controller Probleme AWT, Swing, JavaFX & SWT 5
T Anwendung mit X schliessen AWT, Swing, JavaFX & SWT 1
L JavaFX OpenJFX13 Anwendung exportieren AWT, Swing, JavaFX & SWT 7
D PDF Viewer in SWT-Anwendung AWT, Swing, JavaFX & SWT 8
O Basics - Anwendung erstellen mit mehreren Szenen AWT, Swing, JavaFX & SWT 1
G JavaFX JavaFX-Dialog aus einer Nicht-JavaFX-Anwendung heraus AWT, Swing, JavaFX & SWT 1
A JavaFX Anwendung in Jar Datei AWT, Swing, JavaFX & SWT 8
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
J Splashscreen Start Anwendung AWT, Swing, JavaFX & SWT 14
MiMa Programmeinstellungen für Anwendung?? AWT, Swing, JavaFX & SWT 54
L JavaFX LoadException beim Laden von JavaFX Anwendung AWT, Swing, JavaFX & SWT 6
I JFileChooser mit System L&F bei anderem L&F der eigtl. Anwendung AWT, Swing, JavaFX & SWT 0
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
L JavaFX PdfViewer für JavaFX Anwendung AWT, Swing, JavaFX & SWT 6
D JafaFX Anwendung beenden AWT, Swing, JavaFX & SWT 11
B Wie erstelle ich eine JavaFX Anwendung von diesem Code? AWT, Swing, JavaFX & SWT 3
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
X Anwendung skalierbar AWT, Swing, JavaFX & SWT 3
D JavaFX Erkennen wenn eine Anwendung geschlossen wird und etwas tun? AWT, Swing, JavaFX & SWT 4
D JavaFX Anwendung hängt sich permanent auf AWT, Swing, JavaFX & SWT 6
L JavaFX Java FX Anwendung nach MVC mit Observer Pattern AWT, Swing, JavaFX & SWT 15
X Swing Anwendung regaiert auf keine Buttons mehr wärend while(scanner.hasNextLine()) ausgeführt wird. AWT, Swing, JavaFX & SWT 4
I Variabeln speichern in Desktop Anwendung AWT, Swing, JavaFX & SWT 2
V Anwendung im Vollbild zentrieren AWT, Swing, JavaFX & SWT 13
A Swing Textübergabe innerhalb der Anwendung in unterschiedlichen Fenster AWT, Swing, JavaFX & SWT 8
GreyFox JLabel in laufender Anwendung erzeugen AWT, Swing, JavaFX & SWT 6
J JavaFX Anwendung läuft in eclipse, nicht aber exportiert AWT, Swing, JavaFX & SWT 2
P Anwendung kommt nach minimieren nicht mehr in den Vordergrund AWT, Swing, JavaFX & SWT 5
K 3D-Grafik Anwendung von Java in Gnuplot AWT, Swing, JavaFX & SWT 3
M SWT Anwendung in der Symbolleiste verstecken AWT, Swing, JavaFX & SWT 5
B SWT Redesign SWT Anwendung AWT, Swing, JavaFX & SWT 7
M Java anwendung VOR vollbildspielen (schon wieder...) AWT, Swing, JavaFX & SWT 5
S Swing Lauftext Performance Probleme, in größerer Anwendung AWT, Swing, JavaFX & SWT 6
VfL_Freak Swing Zweiter Monitor von Java-Anwendung ansprechbar ?? AWT, Swing, JavaFX & SWT 2
S Swing Ist meine gute Java Anwendung vorgängig? AWT, Swing, JavaFX & SWT 20
P Klassenaufbau bei komplexerer GUI Anwendung AWT, Swing, JavaFX & SWT 14
S Java GUI Anwendung ohne Konsole starten AWT, Swing, JavaFX & SWT 6
qwerqer Swing Anwendung soll blinken (Taskleiste) AWT, Swing, JavaFX & SWT 3
R Java Desktop Anwendung erstellen. Womit? AWT, Swing, JavaFX & SWT 3
eLogic Fullscreen anwendung aus der man nicht rauskommt AWT, Swing, JavaFX & SWT 37
T Java-Anwendung arbeitet Programm in seltsamer Reihenfolge ab AWT, Swing, JavaFX & SWT 3
H Anwendung schließen ohne System.exit AWT, Swing, JavaFX & SWT 5
R Anwendung ohne Symbol in der Taskleiste AWT, Swing, JavaFX & SWT 3
H SWT RAP Anwendung - Tabelle - Theming AWT, Swing, JavaFX & SWT 3
alderwaran Swing XML editor plugin für eigene anwendung AWT, Swing, JavaFX & SWT 2
G Swing Update-Funktion für Swing-Anwendung AWT, Swing, JavaFX & SWT 5
C Swing Eine SWING-Anwendung mittels MVC AWT, Swing, JavaFX & SWT 4
Eldorado Frage zur Anwendung des MVC-Konzept AWT, Swing, JavaFX & SWT 33
B SWT Hello World-Anwendung mit GUI in Eclipse -Problem mit Import von SWT AWT, Swing, JavaFX & SWT 9
G Applet und Swing Anwendung AWT, Swing, JavaFX & SWT 2
J Client Server Anwendung - Mehrere Clients in einer Server GUI AWT, Swing, JavaFX & SWT 11
F Anwendung auf Teskleiste legen AWT, Swing, JavaFX & SWT 3
B MDI Anwendung alle maximierten InternalFrames in Tabs AWT, Swing, JavaFX & SWT 3
T Anwendung starten AWT, Swing, JavaFX & SWT 5
J Anwendung von Swing nach SWT bzw. Eclipse portieren AWT, Swing, JavaFX & SWT 3
2 Tablet-PC Java-Anwendung -> Tablet-Pen Problem !! AWT, Swing, JavaFX & SWT 3
J Swing Anwendung schließen im Listener AWT, Swing, JavaFX & SWT 3
isowiz Vorteil einer RCP Anwendung gegenüber Swing AWT, Swing, JavaFX & SWT 3
? Java-SWT-Anwendung in der Taskleiste nicht sichtbar AWT, Swing, JavaFX & SWT 6
H Netbeans-Anwendung schliessen AWT, Swing, JavaFX & SWT 8
M "Billig Excel" Anwendung mit Swing - Aufwand ? AWT, Swing, JavaFX & SWT 4
G "Views-Abwechseln-Pro " in RCP-Anwendung AWT, Swing, JavaFX & SWT 2
H PopUp-Fenster in einer Java Server Faces Anwendung AWT, Swing, JavaFX & SWT 4
T Auf Fenster innerhalb der Anwendung zugreifen-auch elegant? AWT, Swing, JavaFX & SWT 2
G Organisation Anwendung mit mehreren Eingabedialogen AWT, Swing, JavaFX & SWT 3
H JWindow schließen bei einem Klick außerhalb der Anwendung? AWT, Swing, JavaFX & SWT 19
G SWT DatePicker funzt nicht in eigener Anwendung AWT, Swing, JavaFX & SWT 5
E Bestehende Anwendung erweitern ->JFrame in JPanel verpack AWT, Swing, JavaFX & SWT 4
U Anwendung nicht beenden beim form schliessen? AWT, Swing, JavaFX & SWT 6
T "Echte" MDI Anwendung AWT, Swing, JavaFX & SWT 4
G Auf markierten Text einer anderen Anwendung zugreifen. AWT, Swing, JavaFX & SWT 8
G Relativer Pfad in Rich Client Anwendung AWT, Swing, JavaFX & SWT 4
N Keyboard-Shortcut, der in der ganzen Anwendung funktioniert AWT, Swing, JavaFX & SWT 2
D JDIC Browser in SWT/JFace Anwendung nutzen AWT, Swing, JavaFX & SWT 2
J Swing-Anwendung mit ActionListener AWT, Swing, JavaFX & SWT 7
S Anwendung über Button beenden? AWT, Swing, JavaFX & SWT 4
O Anwendung aus dem Programm heraus neu starten AWT, Swing, JavaFX & SWT 2
U Anwendung mit mehreren "Fenstern" AWT, Swing, JavaFX & SWT 4
R Screenshot von fremder Anwendung AWT, Swing, JavaFX & SWT 4
Hotkey Freie Icons für Anwendung mit Java Look&Feel AWT, Swing, JavaFX & SWT 4
S SWT-Anwendung als startfähiges Jar unter Linux AWT, Swing, JavaFX & SWT 4
P GUI geschickt von dem Rest der Anwendung trennen AWT, Swing, JavaFX & SWT 6
S HTML-Datei in Anwendung (JEditorPane) AWT, Swing, JavaFX & SWT 5
A Screenshot einer Anwendung erstellen AWT, Swing, JavaFX & SWT 14
A MVC-Pattern - Kreuzweise Anwendung? AWT, Swing, JavaFX & SWT 4
M Komponenten einer Anwendung in JTree strukturiert auflisten? AWT, Swing, JavaFX & SWT 4
G Anwendung um Scrollpane erweitern AWT, Swing, JavaFX & SWT 2
A Look and Feel einer Anwendung verändern AWT, Swing, JavaFX & SWT 7

Ähnliche Java Themen

Neue Themen


Oben