Anwendung aus SystemTray öffnen

Diskutiere Anwendung aus SystemTray öffnen im AWT, Swing, JavaFX & SWT Bereich.
OSchriever

OSchriever

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...
 
J

JustNobody

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

OSchriever

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...
 
J

JustNobody

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

OSchriever

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...
 
J

JustNobody

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

OSchriever

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

OSchriever

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 😀
 
Thema: 

Anwendung aus SystemTray öffnen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben