Auf Stage von FXML-Controller zugreifen

Diskutiere Auf Stage von FXML-Controller zugreifen im AWT, Swing, JavaFX & SWT Bereich.
OSchriever

OSchriever

Hi Freunde,
ich habe ein Problem: Ich möchte ein Programm durch Klick auf einen Button in den Hintergrund versetzen. Ich habe es schon so weit, dass ich das Icon in die System Tray setze, aber wenn ich aus der ActionListener-Methode das Programm "in den Hintergrund verstecken" möchte, dann müsste ich meineStage.hide() ausführen.
Da ich aber in der Klasse FXML-Conroller bin kann ich nicht auf die Stage zugreifen, da die ja nur in der Start-Methode ist. Ich füge den Code an. Wahrscheinlich wird es sich da bei mir nur um eine Wissenslücke handeln.
Ich danke im Voraus vielmals.
Liebe Grüße
Ich habe bewusst nicht den ganzen Code eingefügt, damit es übersichtlicher bleibt.

Hier der Controller:


Java:
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.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 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;



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 protected void hintergrundKlick(ActionEvent event) {
        
        
        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 trayIcon = new TrayIcon(image, "Amr_Trial", 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) {
                    javafx.application.Platform.runLater(new Runnable() {
                        
                        @Override
                        public void run() {
                            
                               meineStage().hide();
                        }
                    });
                                    
                
                }                   
            };           

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

            try{
              tray.add(trayIcon);
            }catch (Exception e) {
              System.err.println("Can't add to tray");
            }
          } else {
            System.err.println("Tray unavailable");
          }
        //
    }
Die Mainklasse:

Java:
import javafx.application.Application;
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);
        //und anzeigen
        meineStage.show();
        
        
    }
    
    
    

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

        
        


    }
    

    

}
 
OSchriever

OSchriever

Ich habe jetzt folgendes codiert:

Java:
@FXML private Pane pane;
    
    
    Stage stage = (Stage)pane.getScene().getWindow();
und

Java:
stage.hide();
im Tray Listener.
Dann habe ich im SceneBuilder dem Pane die fx:id pane zugewiesen.

Dann bekomme ich aber eine Nullpointer Exception... :(
 
L

lam_tr

Ich habe jetzt folgendes codiert:

Java:
@FXML private Pane pane;
   
   
    Stage stage = (Stage)pane.getScene().getWindow();
und

Java:
stage.hide();
im Tray Listener.
Dann habe ich im SceneBuilder dem Pane die fx:id pane zugewiesen.

Dann bekomme ich aber eine Nullpointer Exception... :(
Kannst du mal schauen für was du ein NPE bekommst. Pane, Scene oder WIndow?
 
OSchriever

OSchriever

Hier die Exceptions. Vielen Dank für deine Mühe...



Exception in Application start method
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 javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
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 java.base/sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: javafx.fxml.LoadException:
/C:/Users/oschr/eclipse-workspace/AnomalyRefresh/bin/de/schrieverkommt/sb_AnomalyRefresh.fxml:14

at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.load(Unknown Source)
at de.schrieverkommt.Main.start(Main.java:17)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(Unknown Source)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(Unknown Source)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(Unknown Source)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(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)
... 1 more
Caused by: java.lang.NullPointerException
at de.schrieverkommt.FXMLController.<init>(FXMLController.java:44)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.base/java.lang.Class.newInstance(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processAttribute(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader$Element.processStartElement(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(Unknown Source)
... 18 more
Exception running application de.schrieverkommt.Main
 
L

lam_tr

Hier die Exceptions. Vielen Dank für deine Mühe...



Exception in Application start method
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 javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
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 java.base/sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.RuntimeException: Exception in Application start method
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: javafx.fxml.LoadException:
/C:/Users/oschr/eclipse-workspace/AnomalyRefresh/bin/de/schrieverkommt/sb_AnomalyRefresh.fxml:14

at javafx.fxml/javafx.fxml.FXMLLoader.constructLoadException(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.load(Unknown Source)
at de.schrieverkommt.Main.start(Main.java:17)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(Unknown Source)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$11(Unknown Source)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$9(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(Unknown Source)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(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)
... 1 more
Caused by: java.lang.NullPointerException
at de.schrieverkommt.FXMLController.<init>(FXMLController.java:44)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.base/java.lang.reflect.Constructor.newInstance(Unknown Source)
at java.base/java.lang.Class.newInstance(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processAttribute(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader$Element.processStartElement(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader$ValueElement.processStartElement(Unknown Source)
at javafx.fxml/javafx.fxml.FXMLLoader.processStartElement(Unknown Source)
... 18 more
Exception running application de.schrieverkommt.Main
StackTrace bringt mir an der Stelle nicht viel. Du muss die Anwendung im Debugmode starten und schauen was für pane, scene und window zurückgegeben wird. eins von dem sollte Null sein. Ich vermute die pane.
 
OSchriever

OSchriever

Sauber, ich habe es hinbekommen. Irgendwo hatte ich noch einen Haken im Code. Läuft prima.

Mit welcher Methode kann ich denn die Anwendung wieder sichtbar machen? Also quasi das Gegenteil von stage.hide()?
LG
 
OSchriever

OSchriever

Danke, aber darauf kann ich aus dem Listener -> ListenerTray<- schon wieder nicht zugreifen, warum ist das so?


Java:
@FXML protected void hintergrundKlick(ActionEvent event) {
        
        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 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) {
                    
                                
                                stage.show();
                }                   
            };           

            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");
          }
        //
    }
 
L

lam_tr

Ich vermute mal weil die Anwendung nicht mehr im Fokus ist. Außerdem der SystemTray sowie die dazugehörigen Komponenten basieren auf AWT. Ich weiß nicht wie sauber es ist JavaFX damit zu vermischen.

Aber wenn du schon ein Exit Menu Item hast, dann kannst du doch ein "Show Application" MenuItem machen der das wieder anzeigt oder?
 
OSchriever

OSchriever

Das funktioniert auch nicht, weil das ja auch im AWT-Bereich ist. Ich probiere mal ein bisschen herum damit.
Danke
 
Thema: 

Auf Stage von FXML-Controller zugreifen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben