System Tray Menubutton ActionListener

friednoodles

Aktives Mitglied
Hallo, ich habe bisher relativ erfolgreich versucht mein Programm in den System Tray zu packen.
Für mein Problem ist es wichtig zu wissen, dass mein Programm eine HauptStage hat auf der alles wichtige passiert.
Oben habe ich eine Menubar mit den Punkten:
"Start" = bei einem Klick hier drauf kommst du auf die HauptStage zurück (ist ein Label)
"Optionen" = eigentlich unwichtig für das Problem
"About" = bei einem Klick hier drauf kommst du auf eine Info Seite mit Impressum (ebenfalls ein Label)

Und hier noch die Methode addAppToTray(), in welcher mein Problem liegt. Im Popup Menü habe ich die zwei Punkte "About" und "Exit". Exit funktioniert wie man es erwarten würde und bei About möchte ich, dass sich mein Programm im Vordergrund öffnet und mir meine Infoseite anzeigt.
Java:
    private void addAppToTray() {
        try {
            java.awt.Toolkit.getDefaultToolkit();

            if (!java.awt.SystemTray.isSupported()) {
                System.out.println("No system tray support, application exiting.");
                Platform.exit();
            }
            java.awt.SystemTray tray = java.awt.SystemTray.getSystemTray();
            URL imageLoc = new URL(iconImageLoc);
            java.awt.Image image = ImageIO.read(imageLoc);
            java.awt.TrayIcon trayIcon = new java.awt.TrayIcon(image);
           
            trayIcon.addActionListener(event -> Platform.runLater(this::showStage));

            java.awt.MenuItem openItem = new java.awt.MenuItem("About");
            openItem.addActionListener(event -> Platform.runLater(this::showInfo));

            java.awt.MenuItem exitItem = new java.awt.MenuItem("Exit");
            exitItem.addActionListener(event -> {
                Platform.exit();
                tray.remove(trayIcon);
            });

            final java.awt.PopupMenu popup = new java.awt.PopupMenu();
            popup.add(openItem);
            popup.addSeparator();
            popup.add(exitItem);
            trayIcon.setPopupMenu(popup);
            tray.add(trayIcon);
        } catch (java.awt.AWTException | IOException e) {
            System.out.println("Unable to init system tray");
            e.printStackTrace();
        }
    }

Hier die Methode showStage(), die mir bei Doppelklick auf das Icon das Programm in der Vordergrund holt.
Java:
    private void showStage() {
        if (stage != null) {
            stage.show();
            stage.toFront();
        }
    }

Wie muss ich meine Methode showInfo() füllen damit das funktioniert?
Die HBox für meine Infoseite befindet sich in einem ActionListener, welcher sich in einer Methode befindet die mir das Menü gleich zu Beginn des Programmes erstellt.

Falls mein Problem zu ungenau geschildert ist bitte bescheid sagen, ich kann gerne noch mehr Code liefern falls nötig.
 

Robat

Top Contributor
Die HBox für meine Infoseite befindet sich in einem ActionListener, welcher sich in einer Methode befindet die mir das Menü gleich zu Beginn des Programmes erstellt.
Wenn ich dich richtig verstehe ist das Layout also nur lokal in der Methode definiert, sodass du von außen - sprich von der Methode showInfo() - nicht drauf zugreifen kannst?
Dann musst du das ändern. Aus der Methode showInfo() musst du deine Stage wieder anzeigen (wie in deiner anderen Methode) und dann das Layout wechseln.

Ggf. hab ich dich auch falsch verstanden. Wie genau ist denn deine Layout-Struktur .. also wie wechselst du zwsichen Infoseite und Startseite
 

friednoodles

Aktives Mitglied
Danke für die Hilfe, ich habe glaube einfach zu wenig Infos geliefert. Ich versuche mal von oben nach unten Alles relevante zu posten.

Global habe ich:
Java:
    private Stage stage;
    ConverterMainBox mainBox;
    BorderPane layout;
    Scene scene;
    MenuBar menuBar;
In meinem Programm Start habe ich folgendes:
Java:
        menuBar = createMenu(stage);
        mainBox = new ConverterMainBox(stage, menuBar);
        mainBox.showBox(createStartBox());
Meine Methode createMenu():
Java:
    private MenuBar createMenu(Stage stage) {
        MenuBar menuBar = new MenuBar();
        Menu menuStart = new Menu();
        Label menuLabel = new Label("Start");

        menuLabel.setOnMouseClicked(new EventHandler<Event>() {
            @Override
            public void handle(Event arg0) {
                mainBox.showBox(createStartBox());
            }
        });
        menuStart.setGraphic(menuLabel);

        Menu fileMenu = new Menu("Options");
        CheckMenuItem automKonv = automConv();
        CheckMenuItem automKop = autoCopy();
        fileMenu.getItems().addAll(automKonv, automKop);
        Menu fileMenu1 = new Menu();
        Label menuLabel1 = new Label("About");
        menuLabel1.setOnMouseClicked(new EventHandler<Event>() {
            @Override
            public void handle(Event arg0) {
                mainBox.showBox(createInfoBox());
            }
        });
        fileMenu1.setGraphic(menuLabel1);
        menuBar.getMenus().addAll(menuStart, fileMenu, fileMenu1);
        return menuBar;
    }

und die Methoden showBox() & ConverterMainBox() sind in einer Extra Klasse:
Java:
    public class ConverterMainBox extends VBox {
        MenuBar _menuBar;
        HBox hbox;

        public ConverterMainBox(Stage stage, MenuBar menuBar) {
            this._menuBar = menuBar;
            Scene scene = new Scene(this, 550, 300);
            stage.setScene(scene);
            stage.show();
        }

        public void showBox(Pane box) {
            initBox();
            this.getChildren().add(box);
        }

        private void initBox() {
            this.getChildren().clear();
            this.getChildren().add(_menuBar);
        }
    }
 

Robat

Top Contributor
Okay und sind die mainBox, createInfoBox() und addAppToTray() in der gleichen Klasse?
Dann könntest du doch, wenn ich dein Code richtig interpretiert habe, in der showInfo() Methode einfach mainBox.showBox(createInfoBox()); aufrufen, nachdem du die Stage wieder angezeigt hast.
 

friednoodles

Aktives Mitglied
Ja, die sind alle in der gleichen Klasse. Dein Vorschlag hat funktioniert, vielen dank!
Eine letzte Frage hätte ich aber doch noch:
Global habe ich einen String stehen der die URL für das Icon an sich angibt. Kann ich den Pfad im String auch auf einen Ort auf meiner Festplatte verweisen lassen, wenn ich das Icon downloade?
Und lässt sich so ein Pfad irgendwie verallgemeinern, damit das Programm das Icon korrekt lädt auch wenn das Programm auf einem anderen Rechner gestartet wird?
 

Robat

Top Contributor
Warum legst du das Bild nicht einfach in deiner Applikation als Ressource fest? Sehe keinen Grund dafür, dass das Bild auf dem Rechner liegen muss
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J System Tray verwenden Allgemeine Java-Themen 7
X Input/Output InputStream/Scanner(System.in) read()/hasNextLine() block unterbrechen Allgemeine Java-Themen 7
P9cman java.Lang Klassen fehlen in JRE System Library Allgemeine Java-Themen 1
B Lottospielen mit System, Versuch 2, noch umständlicher als vorher Allgemeine Java-Themen 1
J Frage zu System.getproperties. Allgemeine Java-Themen 60
sascha-sphw Erste Schritte Unit und Integration-Tests im Java Modul System Allgemeine Java-Themen 10
F Frage zu System.in Allgemeine Java-Themen 3
E System property setzten Allgemeine Java-Themen 8
Kirby.exe Movement System für Spiel Allgemeine Java-Themen 13
O Beziehung System.exit(x) <>Errorlevel Allgemeine Java-Themen 2
B System.out Ausgabe auf jtextarea Fehlersuche Allgemeine Java-Themen 8
H Im Tiled-Map-System ein Item anklicken Allgemeine Java-Themen 0
S Java Plugin System (ohne OSGI) Allgemeine Java-Themen 10
D System.arraycopy verhält sich seltsam Allgemeine Java-Themen 1
C Login System Allgemeine Java-Themen 19
A BufferedReader ohne System.in Allgemeine Java-Themen 9
VfL_Freak JDK installieren System-Property "user.dir" Allgemeine Java-Themen 6
J System.arraycopy ergibt anderes Resultat als for-loop Allgemeine Java-Themen 4
F Wie kann ich auf einem System prüfen, ob eine lib verfügbar ist? Allgemeine Java-Themen 2
D Java System.out::println Allgemeine Java-Themen 1
D Methoden Java Applikation Die System Auslastung optimieren ? Allgemeine Java-Themen 7
S Ist Java ein geschlossenes System? Allgemeine Java-Themen 2
L Erste Schritte Suche Java Wiki System? Allgemeine Java-Themen 5
chuxXo System/JLayer Volume ändern Allgemeine Java-Themen 0
Neumi5694 System.out und System.err umleiten - NICHT im Quelltext Allgemeine Java-Themen 4
X System.out/err(Die Console) in JTextArea ausgeben Allgemeine Java-Themen 2
S Best Practice System.arrayCopy verändert Ziel-Array Allgemeine Java-Themen 2
A Methoden Der Sinn von system.out.print(); Allgemeine Java-Themen 9
A System freezes when trying to run external command from Java with wait for Allgemeine Java-Themen 3
A Java | Login-System Allgemeine Java-Themen 3
C System.out.print("") Compiler Fehler Allgemeine Java-Themen 2
Joew0815 Best Practice Wie am besten Plugin-System erstellen? Allgemeine Java-Themen 12
C System.in erhält Input von Tastatur. wo wird das festgelegt? Allgemeine Java-Themen 4
F Benachrichtigungs-System Webapp Java Servlet Allgemeine Java-Themen 10
M collection persistence system Allgemeine Java-Themen 4
V System.out.println an jeder Stelle im Projekt löschen Allgemeine Java-Themen 4
D System.out's in String speichern. Allgemeine Java-Themen 2
H Interpreter-Fehler ArrayIndexOutOfBoundsException bei System.arraycopy() Allgemeine Java-Themen 3
M System herausfinden Allgemeine Java-Themen 6
O Variablen System.getenv: Sinnlose Werte, Arrays?! Allgemeine Java-Themen 6
G java.exe in System 32. Hilfe!!! Allgemeine Java-Themen 8
R Methoden Tag System Problem Allgemeine Java-Themen 3
J System.out im GUI anzeigen Allgemeine Java-Themen 3
N System.exit(0/1) Allgemeine Java-Themen 3
F System.out.println mit log4j ersetzen Allgemeine Java-Themen 10
D System.LoadLibrary(..) - Programm stürzt ab Allgemeine Java-Themen 2
U Classpath DLLs mittels System.load() laden: Allgemeine Java-Themen 6
D Listener auf System.out.err / System.out.println Allgemeine Java-Themen 5
G Input/Output System.in "umbiegen" für junit-Test Allgemeine Java-Themen 4
Kr0e User management system Allgemeine Java-Themen 2
S Java Programm -System Neustart überleben? Allgemeine Java-Themen 3
Rudolf Wann System.exit und wann dispose? Allgemeine Java-Themen 9
ruutaiokwu System.out auf files umlenken in log4j.xml Allgemeine Java-Themen 4
K Objekt-Austausch zwischen zwei Programmen über System-Clipboard Allgemeine Java-Themen 5
agent47 Plugin System Verständnisfrage Allgemeine Java-Themen 6
M Wie externe System-Ressourcen zwangsweise freigeben Allgemeine Java-Themen 2
E Durch System.in.read() blockierten Thread stoppen Allgemeine Java-Themen 10
P System.out im Eclipse plugin Allgemeine Java-Themen 4
C File System Watcher Allgemeine Java-Themen 2
S Verhalten von System.getenv() in Ubuntu / Linux Allgemeine Java-Themen 12
A Problem mit System.getProperty(...) Allgemeine Java-Themen 5
D System.loadlibrary funktioniert nicht Allgemeine Java-Themen 6
H Event ähnliches System Allgemeine Java-Themen 20
Dissi Gammawerte des Grafiktreibers / System ändern? Allgemeine Java-Themen 3
M Plugin-System Allgemeine Java-Themen 4
A NullPointer bei System.getProperty("file.seperator") Allgemeine Java-Themen 4
R System.out oder System.err? Allgemeine Java-Themen 10
M Wie kann ich alle System.out Strings in ein log window umleiten? Allgemeine Java-Themen 6
K System.exec() Programm mit mehreren Parametern Allgemeine Java-Themen 8
G unerklärliches System.out Allgemeine Java-Themen 3
M System.setProperty("javax.net.ssl.trustStore", "mykey.pkx"); Allgemeine Java-Themen 1
T System Preferences + LInux (Ubuntu) Allgemeine Java-Themen 8
G OutputStream to System.out Allgemeine Java-Themen 35
J Wo werden die System properties gespeichert Allgemeine Java-Themen 12
C JSR295 in Produktiven System zu empfehlen? Allgemeine Java-Themen 3
B System CPU Zeit / Last auslesen Allgemeine Java-Themen 2
G Bringt es etwas System.gc() nach großen Aufgaben aufzurufen? Allgemeine Java-Themen 2
T Feststellen ob System-Konsole verfügbar Allgemeine Java-Themen 2
L remote debugging of a multi threaded system Allgemeine Java-Themen 2
F Probleme mit eigenem Plugin-System Allgemeine Java-Themen 3
L System.exit Allgemeine Java-Themen 3
G System.out und String machen was anderes Allgemeine Java-Themen 5
G System.out im window h.inein bringen? Allgemeine Java-Themen 8
A System.in pipen Allgemeine Java-Themen 3
P System.getProperty zu Classloader Allgemeine Java-Themen 21
I Am System angemeldeten Benutzer abfragen Allgemeine Java-Themen 11
E System.out umleiten Allgemeine Java-Themen 2
S system.out und system.err einer Methode in Datei schreiben. Allgemeine Java-Themen 7
S System Informationen auslesen. Allgemeine Java-Themen 3
N Thread und System.out.print() Allgemeine Java-Themen 2
K Kann man System.out in eine Datei speichern? ähnlich wie log Allgemeine Java-Themen 7
B Native DLL zweimal laden: System.load(sPath); Allgemeine Java-Themen 5
P System.getProperty("user.dir") Allgemeine Java-Themen 10
K Abfrage ob JRE oder JDK auf System installiert ist. Allgemeine Java-Themen 12
B serlvet system.out ausgabe Allgemeine Java-Themen 4
N Plugin-System: Klassen über String laden Allgemeine Java-Themen 3
O System.nanoTime() einheitlichen Wert auf mehreren Rechnern? Allgemeine Java-Themen 9
T System-Monitoring in Echtzeit Allgemeine Java-Themen 2
E System.out.println Allgemeine Java-Themen 5
G Umrechnen von grossen Zahlen ins Hex-System Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben