JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode

Knausbär

Mitglied
Hallo,

ich versuche mein Problem mal zu erklären:

Ich habe folgendes vor. Ich habe eine unabhängige Main Klasse in der mittels OPCUA Variablen aus einer S7 Steuerung abgefragt werden.
Anhand eines Wertes einer dieser Variable muss ich nun unterschiedliche Fenster öffnen/schließen können.

Ich habe kein treffendes Problem beim googlen gefunden und absolut keinen Ansatz wie ich da beginnen soll.
Kann mir jemand helfen?
 

KonradN

Super-Moderator
Mitarbeiter
Da würde ich einfach mal zurückfragen: Was ist denn da Dein Problem? Mehrere Fenster in JavaFX zu öffnen ist ja unproblematisch.

Was du mit separater main Methode meinst ist mir aber unklar. Die main Methode ist ein Startpunkt einer Java Applikation. Da hast Du genau eines. Und das ist vollkommen unabhängig von JavaFX Fenstern.

Es wird in der Regel ja Application.launch aufgerufen, was dann ein erstes Fenster öffnet. Aber was da dann für ein Inhalt kommt, ist ja vollkommen nebensächlich.

Du hast also sehr viele Möglichkeiten eben das zu machen, was auch immer du machen willst. Man kann dann maximal überlegen, ob das erste Fenster dann sowas wie ein Splash Screen wird, während du Daten von der "S7 Steuerung" abfragst um dann weitere Fenster zu öffnen und dieses Fenster zu schließen oder so ...
 

DefconDev

Bekanntes Mitglied
Das Problem ist so dürftig beschrieben, dass man nur eine simple Gegenfrage stellen kann. Was hindert dich daran ein Switch Case , If Else Konstrukt aufzubauen und dann die entsprechenden Fenster zu öffnen und zu schließen?

Muss man wissen was ein S7 und/oder OPCUA ist um das Problem zu lösen, wenn sowieso nur Variablen ausgelesen werden über die Main? Sonst würde ich detaillierter erklären was das überhaupt ist. Ein S7 ist für mich ein Samsung Modell, ist aber bestimmt in deinem Fall eine Abkürzung für etwas ganz anderes oder?
 

Knausbär

Mitglied
Hallo,

erst einmal danke für die Antworten.
Ich erkläre das ganze mal etwas genauer.

Ich bin kein Profi in Java ich lerne noch.
Ich habe genau eine Main Methode in der ich noch keinerlei JavaFX habe und das sollte denke ich auch so bleiben.
nun habe ich eine Variable die mittels OPCUA ausgelesen wurde. Wenn diese Variable den Wert 3 annimmt muss ich ein JavaFX Fenster öffnen.
Wenn die Variable den Wert 4 hat ein völlig anderes... und soweiter

Meine Kenntnisse reichen bisher eine JavaFX Anwendung zu schreiben. Vielleicht könnt ihr mir mittels eines kleinen Codeschnipsels auf die Sprünge helfen.

Vielen Dank
 

KonradN

Super-Moderator
Mitarbeiter
Ich habe genau eine Main Methode in der ich noch keinerlei JavaFX habe und das sollte denke ich auch so bleiben.
Das kannst Du gerne so handhaben. Das ist relativ egal. Der übliche Ansatz ist aber, dass Du eine Klasse hast, die von Application erbt und die dann launch aufruft.

Vielleicht könnt ihr mir mittels eines kleinen Codeschnipsels auf die Sprünge helfen.
Für was wird genau ein Codeschnipsel benötigt? Eine typische JavaFX Applikation findet sich (incl. Maven Projekt mit allem drum und dran) z.B. auf https://github.com/kneitzel/JavaFXMavenApp

Diesen Startweg würde ich - gerade am Anfang - immer benutzen und nicht selbst irgendwas basteln. Beim Start werden halt gewisse Dinge initialisiert wie ein Thread, der dann Events bearbeitet und so. Da kann man prinzipiell auch mit Platform.startup und so hantieren, aber das verkompliziert alles nur unnötig.

Neue Fenster sind generell immer einfach per Stage newStage = new Stage(); erstellbar, daher ist das auch sehr unkompliziert - so halt die JavaFX Runtime bereits initialisiert wurde.
 

Knausbär

Mitglied
Das kannst Du gerne so handhaben. Das ist relativ egal. Der übliche Ansatz ist aber, dass Du eine Klasse hast, die von Application erbt und die dann launch aufruft.


Für was wird genau ein Codeschnipsel benötigt? Eine typische JavaFX Applikation findet sich (incl. Maven Projekt mit allem drum und dran) z.B. auf https://github.com/kneitzel/JavaFXMavenApp

Diesen Startweg würde ich - gerade am Anfang - immer benutzen und nicht selbst irgendwas basteln. Beim Start werden halt gewisse Dinge initialisiert wie ein Thread, der dann Events bearbeitet und so. Da kann man prinzipiell auch mit Platform.startup und so hantieren, aber das verkompliziert alles nur unnötig.

Neue Fenster sind generell immer einfach per Stage newStage = new Stage(); erstellbar, daher ist das auch sehr unkompliziert - so halt die JavaFX Runtime bereits initialisiert wurde.
Vielen Dank.

Genau da scheitere ich im Moment.

ich poste mal eine sehr vereinfachte Main Methode wie meine in etwa arbeitet.
Java:
package lagerverwaltung;

import lagerverwaltung.Lagerverwaltung_MainGUI;

public class Test {
    
    private static boolean connected; // Diese Variable wird auf true gesetzt wenn man mittels OPCUA an einem Server verbunden ist
    private static int benötigtesBild; // Diese Variable wird ebenfalls über OPCUa ausgelesen.
    
    
    public static void main(String[] args) {
        
        while (connected) {
            
            if (benötigtesBild == 1) {
                
                // hier scheitere ich jetzt
                
            }           
            
        }
        
    }

}

Die while schleife darf nicht unterbrochen werden. Also muss ich bestimmt über Threads arbeiten aber ich habe keinen Plan wie ich jetzt meine JavaFX anwendung in der If Anweisung ausführen kann.

Sorry für die umständliche Erklärung.
 

KonradN

Super-Moderator
Mitarbeiter
Trenne Dich von dem Gedanken, sowas in der main Methode machen zu wollen. Und Du solltest trennen zwischen dem Auslesen irgendwelcher Dinge und dem, was dann passiert. Das sind zwei paar Schuhe!

Du hast also einen Thread, der die Überprüfung in so einem Thread macht. Dabei stellt er dann irgendwas fest, was er nach außen melden kann - für wen auch immer das interessant sein mag. Das Ganze ist vom Aufbau her im Observer Pattern beschrieben (Und entspricht auch genau dem, was Du z.B. auch von den Events bei den UI Elementen kennst).

Und wenn dann diese Überwachung etwas feststellt, dann kann eine andere Klasse darauf reagieren.

Die Klasse, die von Application erbt, kann dann verwalten, was es so alles gibt:
  • die Klasse, die diese Überwachung macht
  • weiss, welche Fenster es derzeit so alles gibt
  • ggf. Instanzen von Klassen, die irgendwas aktiv tun.

Konkretes kann ich dazu aber nicht sagen, denn wir haben ja keine Ahnung, was da überhaupt so für Anforderungen sind.

Aber was Du wirklich im Hinterkopf behalten solltest: Separation of Concerns - teile den Code auf, so dass Du Aufgaben vernünftig aufgeteilt hast. Das Observable Pattern habe ich bereits genannt, aber für die UI wird dann MVC, MVP oder MVVM wichtig, damit es möglichst übersichtlich bleibt.
 

Knausbär

Mitglied
Trenne Dich von dem Gedanken, sowas in der main Methode machen zu wollen. Und Du solltest trennen zwischen dem Auslesen irgendwelcher Dinge und dem, was dann passiert. Das sind zwei paar Schuhe!

Du hast also einen Thread, der die Überprüfung in so einem Thread macht. Dabei stellt er dann irgendwas fest, was er nach außen melden kann - für wen auch immer das interessant sein mag. Das Ganze ist vom Aufbau her im Observer Pattern beschrieben (Und entspricht auch genau dem, was Du z.B. auch von den Events bei den UI Elementen kennst).

Und wenn dann diese Überwachung etwas feststellt, dann kann eine andere Klasse darauf reagieren.

Die Klasse, die von Application erbt, kann dann verwalten, was es so alles gibt:
  • die Klasse, die diese Überwachung macht
  • weiss, welche Fenster es derzeit so alles gibt
  • ggf. Instanzen von Klassen, die irgendwas aktiv tun.

Konkretes kann ich dazu aber nicht sagen, denn wir haben ja keine Ahnung, was da überhaupt so für Anforderungen sind.

Aber was Du wirklich im Hinterkopf behalten solltest: Separation of Concerns - teile den Code auf, so dass Du Aufgaben vernünftig aufgeteilt hast. Das Observable Pattern habe ich bereits genannt, aber für die UI wird dann MVC, MVP oder MVVM wichtig, damit es möglichst übersichtlich bleibt.

Verstehe ich das jetzt erst einmal Richtig das meine Main Methode in etwa dann so aussehen soll?

Java:
public static void main(String[] args) {
        startMain = new Lagerverwaltung_MainProgramm();
        Thread t = new Thread(startMain); // create thread
        t.start();  // start thread
        launch(args);
    }

Damit könnte ich zwar erst einmal anfangen, verstehe aber dann nicht wie ich verschiedene Fenster mit jeweils eigenen Controllern aufrufen kann.
Also wenn die Variable sich ändert müsste ich ja ein anderes Bild laden. Wer und wie handelt das dann? Ein Controller oder in der Start Methode?

Ich versteh das ganze noch nicht so genau. Meine JavaFX Kenntnisse gehen da noch nicht so tief.
 

KonradN

Super-Moderator
Mitarbeiter
Das ist erst einmal noch kein JavaFX Problem.

Und immer auf die verwendeten Namen achten - was genau macht denn die Klasse "Lagerverwaltung_MainProgramm"?
Was passiert da in dem Thread, den du da startest? Finde einen Namen, der das möglichst gut ausdrückt. Lagerverwaltung ist ja wohl dein ganzes Projekt.

Dann ist der Thread ja wohl in der Verantwortung dieser Klasse. Die Klasse Überwacht etwas und diese Überwachung kann man starten. Also ist da dann etwas wie:

Java:
public class Ueberwachung {
    private Thread ueberwachungThread;
    private volatile boolean shouldRun;
    
    protected void ueberwache() {
        while (shouldRun) {
            // mache die Überwachung....
        }
    }
    
    public void start() {
        if (thread != null && thread.isRunning()) throw new InvalidStateException("Überwachung läuft schon!");
        
        shouldRun = true;
        ueberwachungThread = new Thread (this::ueberwache);
        ueberwachungThread.start();
    }
}

Das kannst Du in der Application Klasse dann tatsächlich erstellen und starten.

Dann hatte ich ja schon auf ein Observer Pattern hingewiesen. Die Klasse will ja andere informieren. Da kann man dann eigene Interfaces und so verwenden oder man nutzt, was es schon gibt, z.B. PropertyChangedListener, PropertyChangedEvent, ...

Die oben genannte Klasse bekommt also zusätzlich noch:
Java:
private List<PropertyChangeListener> listeners = new ArrayList<>();

public synchronized void addListener(PropertyChangeListener listener) {
    listeners.add(listener);
}

private void sendInfo(String property, Object oldValue, Object newValue) {
    List<PropertyChangeListener> currentListeners;
    synchronized(this) {
        currentListeners = listeners.stream().toList();
    }
    PropertyChangeEvent event = new PropertyChangeEvent(this, property, oldValue, newValue);
    
    for (PropertyChangeListener listener : currentListeners) {
        listener.propertyChange(event);
    }
}

// Irgendwo in Deiner Schleife dann ein Aufruf wie:
sendInfo("Whatever", oldValue, newValue);
// um die "Interessierten" zu informieren.

Das einfach nur einmal so im Forum auf die Schnelle geschrieben. Evtl. haben sich dabei Fehler eingeschlichen.

Aber mit diesen Konzepten solltest Du Dich etwas mehr auseinander setzen.
 

Knausbär

Mitglied
Das ist erst einmal noch kein JavaFX Problem.

Und immer auf die verwendeten Namen achten - was genau macht denn die Klasse "Lagerverwaltung_MainProgramm"?
Was passiert da in dem Thread, den du da startest? Finde einen Namen, der das möglichst gut ausdrückt. Lagerverwaltung ist ja wohl dein ganzes Projekt.

Dann ist der Thread ja wohl in der Verantwortung dieser Klasse. Die Klasse Überwacht etwas und diese Überwachung kann man starten. Also ist da dann etwas wie:

Java:
public class Ueberwachung {
    private Thread ueberwachungThread;
    private volatile boolean shouldRun;
   
    protected void ueberwache() {
        while (shouldRun) {
            // mache die Überwachung....
        }
    }
   
    public void start() {
        if (thread != null && thread.isRunning()) throw new InvalidStateException("Überwachung läuft schon!");
       
        shouldRun = true;
        ueberwachungThread = new Thread (this::ueberwache);
        ueberwachungThread.start();
    }
}

Das kannst Du in der Application Klasse dann tatsächlich erstellen und starten.

Dann hatte ich ja schon auf ein Observer Pattern hingewiesen. Die Klasse will ja andere informieren. Da kann man dann eigene Interfaces und so verwenden oder man nutzt, was es schon gibt, z.B. PropertyChangedListener, PropertyChangedEvent, ...

Die oben genannte Klasse bekommt also zusätzlich noch:
Java:
private List<PropertyChangeListener> listeners = new ArrayList<>();

public synchronized void addListener(PropertyChangeListener listener) {
    listeners.add(listener);
}

private void sendInfo(String property, Object oldValue, Object newValue) {
    List<PropertyChangeListener> currentListeners;
    synchronized(this) {
        currentListeners = listeners.stream().toList();
    }
    PropertyChangeEvent event = new PropertyChangeEvent(this, property, oldValue, newValue);
   
    for (PropertyChangeListener listener : currentListeners) {
        listener.propertyChange(event);
    }
}

// Irgendwo in Deiner Schleife dann ein Aufruf wie:
sendInfo("Whatever", oldValue, newValue);
// um die "Interessierten" zu informieren.

Das einfach nur einmal so im Forum auf die Schnelle geschrieben. Evtl. haben sich dabei Fehler eingeschlichen.

Aber mit diesen Konzepten solltest Du Dich etwas mehr auseinander setzen.
Danke ich versuche mich damit mal auseinander zu setzen. Was mich mir zwar noch nicht erschließt ist das mit den mehren Fenstern.
 

KonradN

Super-Moderator
Mitarbeiter
Ein neues Fenster kannst Du immer mittels Stage stage = new Stage(); erstellen. Da dann halt die üblichen Dinge wie Titel und Scene setzen - das ist aber genau so, wie in der start Methode in der halt die Stage als Parameter übergeben wurde.
 

KonradN

Super-Moderator
Mitarbeiter
Das launch(args) ist der eigentliche Start der JavaFX Applikation mit allem, was dazu gehört.

Das, was ich da noch geschrieben habe, bezog sich auf das Öffnen eines zusätzlichen Fensters.

Das sind also zwei unterschiedliche Dinge.
 

Knausbär

Mitglied
Das launch(args) ist der eigentliche Start der JavaFX Applikation mit allem, was dazu gehört.

Das, was ich da noch geschrieben habe, bezog sich auf das Öffnen eines zusätzlichen Fensters.

Das sind also zwei unterschiedliche Dinge.
Ok wie gesagt das mein Programm nicht das beste ist, ist mir klar. Das da viel Luft nach oben ist...

Was ich aber halt ganz und gar nicht verstehe ist das mit dem JavaFX. Ich kenne das nur so:
Und da verstehe ich nicht wie ich zwischen 2 Fenstern und 2 Controllern hin und herswitche. Genauso verstehe ich dann nicht wo ich das launch aufrufe wenn nicht in der Main.

Java:
package lagerverwaltung;

import lagerverwaltung.hmi.Main_Controller;
import lagerverwaltung.lager.Lagerplatz;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.WindowEvent;

public class Lagerverwaltung_MainGUI extends Application{   
    
    private static Lagerverwaltung_MainProgramm startMain;   
    
    static Lagerplatz [] [] [] lagerplatz = new Lagerplatz[10][100][10];
    
    @Override
    public void start(Stage mainStage) throws Exception {       
        
        // eine Instanz von FXMLLoader erzeugen
        FXMLLoader meinLoader = new FXMLLoader(getClass().getResource("/lagerverwaltung/hmi/Main.fxml"));       
        // die Datei laden
        Parent root = meinLoader.load();
        // den Controller beschaffen
        Main_Controller meinController = meinLoader.getController();
        meinController.setMeineStage(mainStage);
        
        // die Szene erzeugen
        Scene mainScene = new Scene(root, 1000, 600);
        
        // den Titel über stage setzen
        mainStage.setTitle("Main Lagerverwaltung");
        
        // die Scene setzen
        mainStage.setScene(mainScene);
        
        mainStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent windowEvent) {
                close();               
            }
        });
        
        //
        int aktuellesBild = Lagerverwaltung_MainProgramm.getAktuellesBild();
        int hilfsbild = Lagerverwaltung_MainProgramm.getHilfsbild();
        
        System.out.println(" HilfsbildNr: " + hilfsbild);
        
        
        
        // Größe nicht veränderbar und ohne Menüleiste anzeigen
        mainStage.initStyle(StageStyle.UNDECORATED);
        mainStage.setResizable(true);
        
        // und anzeigen
        mainStage.show();       
        
    }   
    
    // on close
    public static void close() {               
        startMain.stop();
        Platform.exit();
    }
    
    
    
    public static void main(String[] args) {
        startMain = new Lagerverwaltung_MainProgramm();
        Thread t = new Thread(startMain); // create thread
        t.start();  // start thread
        launch(args);
    }
}
 

KonradN

Super-Moderator
Mitarbeiter
Du hast da alles in eine Klasse gequetscht - das macht wenig Sinn, da Du so nur die Übersicht verlieren kannst.

Ja, das launch ist und bleibt in der main Methode.

Und das ist die Klasse der Applikation - daher erbt diese auch von Application. Da kommt aber sonst auch nicht wirklich weitere Funktionalität rein.

Du willst da irgend einen Thread der irgendwas überwacht oder so? Dann mach eine separate Klasse. Habe ich in #9 gezeigt, wie sowas aufgebaut sein könnte.

Und bei dem launch Aufruf wird auch eine Instanz der Klasse erzeugt -> Das musst Du also nicht mehr machen! (So hast Du hinterher mehrere Instanzen...)
Statische Variablen solltest Du sein lassen - das führt meist nur zu Problemen.

Dann hast Du ggf. etwas wie:
Java:
package lagerverwaltung;

import lagerverwaltung.hmi.Main_Controller;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.WindowEvent;

public class LagerVerwaltungApp extends Application{   
    
    private Main_Controller meinController;
    
    @Override
    public void start(Stage mainStage) throws Exception {       
        FXMLLoader meinLoader = new FXMLLoader(getClass().getResource("/lagerverwaltung/hmi/Main.fxml"));       
        Parent root = meinLoader.load();
        meinController = meinLoader.getController();
        meinController.setMeineStage(mainStage);
        Scene mainScene = new Scene(root, 1000, 600);
        mainStage.setTitle("Main Lagerverwaltung");
        mainStage.setScene(mainScene);
        mainStage.setOnCloseRequest( () -> close() ); // Ist sowas notwendig?
        
        mainStage.initStyle(StageStyle.UNDECORATED);
        mainStage.setResizable(true);
        
        mainStage.show();       
    }   
    
    public static void close() {               
        Platform.exit();
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}
als ersten JavaFX Startpunkt.

So eine Überwachung oder was auch immer der Thread macht, hast Du dann in einer anderen Klasse, also z.B. wie von mir skizziert in einer Klasse Ueberwachung. Das kannst Du dann mit einbauen:
Java:
package lagerverwaltung;

import lagerverwaltung.hmi.Main_Controller;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.WindowEvent;

public class LagerVerwaltungApp extends Application{   
    
    private Main_Controller meinController;
    private Uberwachung ueberwachung;
    
    @Override
    public void start(Stage mainStage) throws Exception {       
        FXMLLoader meinLoader = new FXMLLoader(getClass().getResource("/lagerverwaltung/hmi/Main.fxml"));       
        Parent root = meinLoader.load();
        meinController = meinLoader.getController();
        meinController.setMeineStage(mainStage);
        Scene mainScene = new Scene(root, 1000, 600);
        mainStage.setTitle("Main Lagerverwaltung");
        mainStage.setScene(mainScene);
        mainStage.setOnCloseRequest( () -> close() ); // Ist sowas notwendig?
        
        mainStage.initStyle(StageStyle.UNDECORATED);
        mainStage.setResizable(true);
        
        mainStage.show();       
        
        ueberwachung = new Ueberwachung();
        ueberwachung.start();
        ueberwachung.addPropertyListener(meinController::bearbeiteUeberwachungsPropertyChanges);
    }   
    
    public static void close() {               
        Platform.exit();
    }
    
    public static void main(String[] args) {
        launch(args);
    }
}

Das setzt jetzt voraus, dass der Controller eine Methode bearbeiteUeberwachungsPropertyChanges hat, die ein PropertyChangeEvent als Parameter entgegen nimmt.
==> Da hast Du dann im Controller eine Stelle, die auf erkannte Veränderungen reagieren kann.

Was ich auch raus genommen habe, ist Dein Array mit irgendwelchen Daten. Daten sind ordentlich, unabhängig von JavaFX Applikation / Controllern und Co zu verwalten. Also auch eine eigene Klasse mit einer eigenen Instanz. Die kannst Du da auch in start dann initialisieren und Du kannst die dann z.B. an den Controller geben oder so. Aber das ist nicht in der Application Klasse.
 

Knausbär

Mitglied
Du hast da alles in eine Klasse gequetscht - das macht wenig Sinn, da Du so nur die Übersicht verlieren kannst.

Ja, das launch ist und bleibt in der main Methode.

Und das ist die Klasse der Applikation - daher erbt diese auch von Application. Da kommt aber sonst auch nicht wirklich weitere Funktionalität rein.

Du willst da irgend einen Thread der irgendwas überwacht oder so? Dann mach eine separate Klasse. Habe ich in #9 gezeigt, wie sowas aufgebaut sein könnte.

Und bei dem launch Aufruf wird auch eine Instanz der Klasse erzeugt -> Das musst Du also nicht mehr machen! (So hast Du hinterher mehrere Instanzen...)
Statische Variablen solltest Du sein lassen - das führt meist nur zu Problemen.

Dann hast Du ggf. etwas wie:
Java:
package lagerverwaltung;

import lagerverwaltung.hmi.Main_Controller;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.WindowEvent;

public class LagerVerwaltungApp extends Application{  
   
    private Main_Controller meinController;
   
    @Override
    public void start(Stage mainStage) throws Exception {      
        FXMLLoader meinLoader = new FXMLLoader(getClass().getResource("/lagerverwaltung/hmi/Main.fxml"));      
        Parent root = meinLoader.load();
        meinController = meinLoader.getController();
        meinController.setMeineStage(mainStage);
        Scene mainScene = new Scene(root, 1000, 600);
        mainStage.setTitle("Main Lagerverwaltung");
        mainStage.setScene(mainScene);
        mainStage.setOnCloseRequest( () -> close() ); // Ist sowas notwendig?
       
        mainStage.initStyle(StageStyle.UNDECORATED);
        mainStage.setResizable(true);
       
        mainStage.show();      
    }  
   
    public static void close() {              
        Platform.exit();
    }
   
    public static void main(String[] args) {
        launch(args);
    }
}
als ersten JavaFX Startpunkt.

So eine Überwachung oder was auch immer der Thread macht, hast Du dann in einer anderen Klasse, also z.B. wie von mir skizziert in einer Klasse Ueberwachung. Das kannst Du dann mit einbauen:
Java:
package lagerverwaltung;

import lagerverwaltung.hmi.Main_Controller;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.WindowEvent;

public class LagerVerwaltungApp extends Application{  
   
    private Main_Controller meinController;
    private Uberwachung ueberwachung;
   
    @Override
    public void start(Stage mainStage) throws Exception {      
        FXMLLoader meinLoader = new FXMLLoader(getClass().getResource("/lagerverwaltung/hmi/Main.fxml"));      
        Parent root = meinLoader.load();
        meinController = meinLoader.getController();
        meinController.setMeineStage(mainStage);
        Scene mainScene = new Scene(root, 1000, 600);
        mainStage.setTitle("Main Lagerverwaltung");
        mainStage.setScene(mainScene);
        mainStage.setOnCloseRequest( () -> close() ); // Ist sowas notwendig?
       
        mainStage.initStyle(StageStyle.UNDECORATED);
        mainStage.setResizable(true);
       
        mainStage.show();      
       
        ueberwachung = new Ueberwachung();
        ueberwachung.start();
        ueberwachung.addPropertyListener(meinController::bearbeiteUeberwachungsPropertyChanges);
    }  
   
    public static void close() {              
        Platform.exit();
    }
   
    public static void main(String[] args) {
        launch(args);
    }
}

Das setzt jetzt voraus, dass der Controller eine Methode bearbeiteUeberwachungsPropertyChanges hat, die ein PropertyChangeEvent als Parameter entgegen nimmt.
==> Da hast Du dann im Controller eine Stelle, die auf erkannte Veränderungen reagieren kann.

Was ich auch raus genommen habe, ist Dein Array mit irgendwelchen Daten. Daten sind ordentlich, unabhängig von JavaFX Applikation / Controllern und Co zu verwalten. Also auch eine eigene Klasse mit einer eigenen Instanz. Die kannst Du da auch in start dann initialisieren und Du kannst die dann z.B. an den Controller geben oder so. Aber das ist nicht in der Application Klasse.

Ich versuche mich mal an deinen Beispielen langzuhangeln...

Verstehe ich das dann Richtig das es nur den einen Controller gibt? Oder gibt es dann Trotzdem pro Bild einen Controller?

Sorry für die vielen Fragen
 

DefconDev

Bekanntes Mitglied
Die Grundlagen von Java aber beherrschst du? Mein Eindruck, du machst zu viel Copy&Paste aber verstehst die Hintergründe nicht.

An deiner Stelle würde ich eher eine winzige JavaFx Applikation schreiben mit zwei Buttons die ihren Schriftzug ändern per Mausklick auf den Button.
 

KonradN

Super-Moderator
Mitarbeiter
Verstehe ich das dann Richtig das es nur den einen Controller gibt? Oder gibt es dann Trotzdem pro Bild einen Controller?
Du hast in der Regel pro Scene einen Controller. Wenn Du in einer Scene ein anderes fxml lädst, dann kannst Du das als eine Einheit ansehen, die einen eigenen Controller hat. Aber das Übliche ist - gerade am Anfang - ein Controller pro Scene.
 

Jw456

Top Contributor
Java:
public class Lagerverwaltung_MainGUI extends Application{ 
  
    private static Lagerverwaltung_MainProgramm startMain; 
  
        public static void main(String[] args) {
        startMain = new Lagerverwaltung_MainProgramm();  // würde auch nicht in der start Mehode gehen static und new  past nicht zusammen.
        Thread t = new Thread(startMain); // create thread
        t.start();  // start thread
        launch(args);
    }
}
 

KonradN

Super-Moderator
Mitarbeiter
würde auch nicht in der start Mehode gehen static und new past nicht zusammen.
Kannst Du Dir angewöhnen, bitte klare Aussagen zu machen? Hier muss man raten, was Du überhaupt sagen willst.

a) Natürlich geht das - Du kannst in einer nicht statischen Methode einer statischen Variable eine neue Instanz zuweisen. Daher ist die Aussage, dass sowas in der start Methode nicht geht, schlicht falsch.

b) wenn es sich auf meine Aussagen bezieht: Da ist klar gesagt, dass die Variable eben nicht statisch sein sollte:
Statische Variablen solltest Du sein lassen - das führt meist nur zu Problemen.

Aber da mir Deine Intention komplett unbekannt ist und ich nicht weiss, worauf Du hinaus willst, sind das einfach nur kleine Hinweise.
 

Jw456

Top Contributor
Was ich auch raus genommen habe, ist Dein Array mit irgendwelchen Daten. Daten sind ordentlich, unabhängig von JavaFX Applikation / Controllern und Co zu verwalten. Also auch eine eigene Klasse mit einer eigenen Instanz. Die kannst Du da auch in start dann initialisieren und Du kannst die dann z.B. an den Controller geben oder so. Aber das ist nicht in der Application Klasse.
das werden die Daten sein die die SPS setzt, verändert die er überwachen will.
 

KonradN

Super-Moderator
Mitarbeiter
das werden die Daten sein die die SPS setzt, verändert die er überwachen will.
Bei der Aussage ist es irrelevant, was genau das für Daten sind. Daten sollten in einem Programm ordentlich verwaltet werden. Und das ist unabhängig von einer JavaFX Applikations Klasse. Damit gehört das von mir aus in eine Klasse Lager a.la.

Java:
public class Lager {
    public final static int LAGER_BREITE = 10;
    public final static int LAGER_LAENGE = 100;
    public final static int LAGER_HOEHE = 10;
    
    private Lagerplatz[][][] lagerplaetze = new Lagerplatz[LAGER_BREITE][LAGER_LAENGE][LAGER_HOEHE];
    
    // Methoden zum Zugriff die eben diese physische Speicherung der Daten kapseln.
}

Das die Dimensionen sowas wie Breite, Länge und Höhe sind, ist jetzt einfach mal eine wilde Unterstellung. Das kann irgendwas sein, dann werden die Konstanten halt umbenannt zu LAGER_WAS_AUCH_IMMER und so ...

Aber deutlich wird hoffentlich, dass hier Daten sauber gekapselt werden und Zugriffe über definierte Schnittstellen erfolgen.
 

Jw456

Top Contributor
Bei der Aussage ist es irrelevant, was genau das für Daten sind. Daten sollten in einem Programm ordentlich verwaltet werden. Und das ist unabhängig von einer JavaFX Applikations Klasse. Damit gehört das von mir aus in eine Klasse Lager a.la.
Das hat keiner angezweifelt. Das war nur ein Hinweis was die Daten bedeuten sollen zu dir. Mehr nicht.
Das sie an der stelle falsch sind , ist klar hattest du ja schon gesagt.


Etwa mit den flaschen Bein aufgestanden. 😀
Nicht aufregen immer weiter atmen würden Taucher sagen. 🤿 🐟🐬
 

KonradN

Super-Moderator
Mitarbeiter
Etwa mit den flaschen Bein aufgestanden. 😀
Nicht aufregen immer weiter atmen würden Taucher sagen. 🤿 🐟🐬
Sorry, aber ich rege mich nicht auf. Ich verstehe nur eben in keiner Weise, was Du beitragen willst.

Bei #19 hast Du einfach einen kleinen Kommentar im Code hinzugefügt - worauf Du hinaus wolltest, weiss ich immer noch nicht und Du willst das nicht erläutern.

Dein Hinweis in #22 zitiert meine Aussage, die in erster Linie aussagt, dass da etwas sauber getrennt werden soll. Das ist die Aussage. Nichts anderes. Das sind irgendwelche Daten. Was, spielt keine Rolle. Und nein - ich bezweifle, dass da die SPS Daten rein schreibt. Denn er will ja in einem Thread die SPS auswerten. Also wird da eher eine Komponente Daten aus der SPS auslesen, diese irgendwohin geben damit diese dann im Datenbestand abgelegt werden. Das sind und bleiben aber irgendwelche Daten (die Klasse Lagerplatz kennen wir halt nicht).

Ich sehe also bei Deinem Hinweis auch hier nicht wirklich einen besonderen Sinn. Ich bezweifle, dass dies dem TE weiter helfen wird. Wenn Du mir irgendwie hier weiter helfen wolltest mit irgendwelchen Informationen, dann muss ich Dich auch enttäuschen. Auch das ist nicht der Fall.

Alles, was Du mit Deinen Kommentaren in #19 und #22 erreicht hast: Du hast es geschafft, mich in so fern zu triggern, das ich darüber nachgedacht habe, was Du evtl. meinen könntest. Um das dann zu hinterfragen (worauf von Dir keine Antwort gekommen ist) bzw. meine Aussage noch einmal zu erläutern (Weil Du da ja etwas von mir zitiert hast und ich davon ausgegangen bin, dass sich Deine neue Aussage auf meine Aussage bezieht). Um dann so einen Kommentar, wie da oben zitiert, zu bekommen? Ich bin weder mit dem falschen Bein aufgestanden noch rege ich mich auf. Ich frage mich aber: Denkst Du nicht darüber nach, was Du wem genau mitteilen willst? Was hilfreich sein könnte (oder eben nicht)? Um dann eine verständliche Antwort zu schreiben? Das wäre etwas, das ich mir von Dir etwas mehr wünschen würde.
 

Jw456

Top Contributor
Mit #19 gebe ich dir recht habe ja auch ein "oh" gegeben. Ja man kann eine static variable mit einen new initialisiert.

Und sein Code Versuch sieht für mich so aus als ob er die Sps in das Array schreiben lassen will oder wollte tut.
Da es static ist und somit auch aus einer anderen Klasse, Thread... Benutzt werden kann. Ja Package ich weiß.

Ob das wirklich so ist er so wollte, solte der TE beantworten. Hier weiter zu spekulieren macht keinen Sinn.

Wenn es die Daten von der Sps sind. Dann wäre es sinnvoll zu zeigen wie mit welchen Möglichkeiten er sie beobachten kann und bei Veränderung anzuzeigen.
Ansatz weise hast du das ja getan.
Am Beispiel PropertyListener.
 
Ok wie gesagt das mein Programm nicht das beste ist, ist mir klar. Das da viel Luft nach oben ist...

Was ich aber halt ganz und gar nicht verstehe ist das mit dem JavaFX. Ich kenne das nur so:
Und da verstehe ich nicht wie ich zwischen 2 Fenstern und 2 Controllern hin und herswitche. Genauso verstehe ich dann nicht wo ich das launch aufrufe wenn nicht in der Main.

Java:
package lagerverwaltung;

import lagerverwaltung.hmi.Main_Controller;
import lagerverwaltung.lager.Lagerplatz;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
import javafx.stage.WindowEvent;

public class Lagerverwaltung_MainGUI extends Application{  
   
    private static Lagerverwaltung_MainProgramm startMain;  
   
    static Lagerplatz [] [] [] lagerplatz = new Lagerplatz[10][100][10];
   
    @Override
    public void start(Stage mainStage) throws Exception {      
       
        // eine Instanz von FXMLLoader erzeugen
        FXMLLoader meinLoader = new FXMLLoader(getClass().getResource("/lagerverwaltung/hmi/Main.fxml"));      
        // die Datei laden
        Parent root = meinLoader.load();
        // den Controller beschaffen
        Main_Controller meinController = meinLoader.getController();
        meinController.setMeineStage(mainStage);
       
        // die Szene erzeugen
        Scene mainScene = new Scene(root, 1000, 600);
       
        // den Titel über stage setzen
        mainStage.setTitle("Main Lagerverwaltung");
       
        // die Scene setzen
        mainStage.setScene(mainScene);
       
        mainStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent windowEvent) {
                close();              
            }
        });
       
        //
        int aktuellesBild = Lagerverwaltung_MainProgramm.getAktuellesBild();
        int hilfsbild = Lagerverwaltung_MainProgramm.getHilfsbild();
       
        System.out.println(" HilfsbildNr: " + hilfsbild);
       
       
       
        // Größe nicht veränderbar und ohne Menüleiste anzeigen
        mainStage.initStyle(StageStyle.UNDECORATED);
        mainStage.setResizable(true);
       
        // und anzeigen
        mainStage.show();      
       
    }  
   
    // on close
    public static void close() {              
        startMain.stop();
        Platform.exit();
    }
   
   
   
    public static void main(String[] args) {
        startMain = new Lagerverwaltung_MainProgramm();
        Thread t = new Thread(startMain); // create thread
        t.start();  // start thread
        launch(args);
    }
}

Hi,

also ich habe z.B. nur eine Stage in welcher ich unterschiedliche StackPanes per "visible" Eigenschaft anzeige. Das könnte dir die Sache eventuell auch erleichtern. Funktioniert relativ einfach sofern die anzuzeigenden Oberflächen die gleiche Größe und nur unterschiedlichen Inhalt besitzen.
Arbeitest du mit dem Scenebuilder ist es etwas umständig, da du hier die "visible" Eigenschaft immer händisch setzen musst um die einzelenen Panes zu bearbeiten und diese auch nicht übereinander gelegt angezeigt zu bekommen.


gruß
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Javafx hängt sich auf AWT, Swing, JavaFX & SWT 31
Juelin StringGrid in SceneBuilder und javaFX AWT, Swing, JavaFX & SWT 2
Juelin starten maven javafx programm ohne netbeans AWT, Swing, JavaFX & SWT 38
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
MiMa JUnit5 im JavaFX Projekt AWT, Swing, JavaFX & SWT 2
Juelin in javafx Event auslösen AWT, Swing, JavaFX & SWT 4
MiMa Fonts, Icons, Bilder in JavaFX Anwendung AWT, Swing, JavaFX & SWT 5
MiMa SwingFXUtils in JavaFX 20 AWT, Swing, JavaFX & SWT 6
MiMa JavaFX Fenstertitel zu klein. AWT, Swing, JavaFX & SWT 1
MiMa JavaFX JAR unter Windows ausführen schlägt fehl? AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
Hatsi09 Javafx MediaPlayer spielt nicht immer AWT, Swing, JavaFX & SWT 3
Hatsi09 Javafx Neuladen von ImageView und MediaView AWT, Swing, JavaFX & SWT 3
Maxim6394 JavaFX Umlaute in JavaFX GUI AWT, Swing, JavaFX & SWT 12
Maxim6394 JavaFX Scene Builder - Crash bei eigener Komponente AWT, Swing, JavaFX & SWT 2
Ernesto95 JavaFX JavaFX GUI mit sehr vielen Update requests AWT, Swing, JavaFX & SWT 4
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
JavaSchmecktLecker JavaFX JavaFX Ordner automatisch verlinken AWT, Swing, JavaFX & SWT 2
melaniemueller Taschenrechner JavaFX AWT, Swing, JavaFX & SWT 4
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
thor_norsk JavaFX Anwendung stürzt ab AWT, Swing, JavaFX & SWT 4
berserkerdq2 Skalieren sich javafx objekte automatisch auf die Bildschirmgröße AWT, Swing, JavaFX & SWT 6
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
B Java Projekt mit JavaFX und jfoenix ausführbar machen AWT, Swing, JavaFX & SWT 46
H JavaFX wie JavaFX Projekt aufsetzen? AWT, Swing, JavaFX & SWT 10
thor_norsk JavaFX - Grafikkarte AWT, Swing, JavaFX & SWT 7
MiHimbert Rückmeldung an den aufrufenden JAVAFX-Dialog AWT, Swing, JavaFX & SWT 1
MiMa JavaFX Runtime components are Missing??? AWT, Swing, JavaFX & SWT 3
J JavaFx PDF in einem Element in einem Fenster anzeigen. AWT, Swing, JavaFX & SWT 11
B JavaFX Sprachumschaltung mit Button auf der HMI AWT, Swing, JavaFX & SWT 6
H JavaFX Fehlende JavaFX Package AWT, Swing, JavaFX & SWT 10
_user_q Kann man ein 2. JavaFX-Fenster auch beenden (exit) statt schließen (close) lassen? AWT, Swing, JavaFX & SWT 8
G JavaFX Line Chart mit Farbverlauf/Gradient in Linie AWT, Swing, JavaFX & SWT 1
thor_norsk JavaFX, FXML und SceneBuilder AWT, Swing, JavaFX & SWT 6
_user_q Über installDist exportiertes Programm wirft "Unsupported JavaFX configuration" AWT, Swing, JavaFX & SWT 0
CodingBerlin JavaFX Programm läuft nur unter Eclipse AWT, Swing, JavaFX & SWT 1
H Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen AWT, Swing, JavaFX & SWT 44
temi JavaFX "Frames" in JavaFx - passende Komponente? AWT, Swing, JavaFX & SWT 13
G JavaFX Steuerung bzw. Test von externer JavaFX Anwendung (liegt nur als jar vor) AWT, Swing, JavaFX & SWT 9
_user_q [JavaFX] Spinner so einstellen, dass er nicht leer bleiben darf? AWT, Swing, JavaFX & SWT 6
S Javafx getResource-Pfad wird nicht erkannt AWT, Swing, JavaFX & SWT 7
A JavaFX exportierte Jar ohne beim starten die Libs hinzufügen? AWT, Swing, JavaFX & SWT 2
J JavaFX Schiffe versenken mit JavaFX und Scene builder AWT, Swing, JavaFX & SWT 3
Encera ArrayList mit eigenen Objekten in JavaFX sortieren und ausgeben AWT, Swing, JavaFX & SWT 50
L JavaFx Textformatierung mittels Datenbank und Funktion anpassen AWT, Swing, JavaFX & SWT 5
sserio Wie funktioniert ein Controller bei JavaFx? AWT, Swing, JavaFX & SWT 1
sserio Kann man bei JavaFx ein Fenster aufkommen lassen? AWT, Swing, JavaFX & SWT 1
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
Tassos JavaFX/Problem mit der Maussteuerung in Stackpane AWT, Swing, JavaFX & SWT 7
S Ich bringe Code mit JavaFX unter Apache NetBeans IDE 12.6 nicht zum laufen. AWT, Swing, JavaFX & SWT 14
K Bekomme (u.a) javafx.fxml.LoadException trotz "korrektem" Code AWT, Swing, JavaFX & SWT 8
S JavaFX: voneinander abhängige TextFields AWT, Swing, JavaFX & SWT 33
M Gluon will JavaFX in den Browser stecken AWT, Swing, JavaFX & SWT 0
H javafx application does not exist AWT, Swing, JavaFX & SWT 16
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
izoards JavaFX TableView mit Array Inhalt füllen AWT, Swing, JavaFX & SWT 1
M Javafx versuch Bibliothek zu erstellen AWT, Swing, JavaFX & SWT 0
N JavaFX Javafx intelij Projekt zu ausführbaren jar Datei Machen AWT, Swing, JavaFX & SWT 1
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
izoards JavaFX TextFlow - Sonderzeichen AWT, Swing, JavaFX & SWT 1
maximstein JavaFX WebView - java.lang.NoSuchMethodError: 'boolean com.sun.prism.ResourceFactory.isDisposed()' AWT, Swing, JavaFX & SWT 4
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
MiHimbert javaFX openfx (17) datepicker AWT, Swing, JavaFX & SWT 3
A Mit JavaFX einzelne Zeilen in TableView farbig markieren AWT, Swing, JavaFX & SWT 5
melaniemueller JavaFX Taschenrechner mit SceneBuilder AWT, Swing, JavaFX & SWT 12
Jose05 Javafx Label Höhe=Breite AWT, Swing, JavaFX & SWT 1
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
izoards JavaFX editierbare Tabelle AWT, Swing, JavaFX & SWT 4
N javafx Position der Bustaben finden label AWT, Swing, JavaFX & SWT 1
D Verschieden Scenen ansprechen mit dem Scene Builder und JavaFX (Eclipse) AWT, Swing, JavaFX & SWT 16
izoards JavaFX Background Task warten auf Knopfdruck AWT, Swing, JavaFX & SWT 4
M Zufallsgenerator bei JavaFx AWT, Swing, JavaFX & SWT 1
N Label Schriftart Ändern javafx AWT, Swing, JavaFX & SWT 2
L JavaFX JavaFX, MVVM und SceneBuilder AWT, Swing, JavaFX & SWT 4
S JavaFx Album AWT, Swing, JavaFX & SWT 137
I JavaFX - Pane wechseln über 2. Controller AWT, Swing, JavaFX & SWT 5
melaniemueller JavaFX Beispiel kann nicht ausgeführt werden AWT, Swing, JavaFX & SWT 4
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
J JavaFX - Included FXML - Entfernen feststellen AWT, Swing, JavaFX & SWT 2
J JavaFX JavaFX/ Taskmenu / UML Klassendiagramm AWT, Swing, JavaFX & SWT 2
Davee JavaFX JavaFX Jar ausführbar jedoch nicht alle Stages AWT, Swing, JavaFX & SWT 3
2 JavaFX die ChoiceBox leitet den String nicht weiter oder es komm zu einem NullPointer AWT, Swing, JavaFX & SWT 8
C MouseEvent JavaFX AWT, Swing, JavaFX & SWT 4
L JavaFX javafx.fxml.LoadException bei einem Taschenrechner AWT, Swing, JavaFX & SWT 5
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
M Error occurred during initialization of boot layer java.lang.module.FindException: Module javafx.controls not found AWT, Swing, JavaFX & SWT 14
G javafx build.fxbuild in eclipse und ANT AWT, Swing, JavaFX & SWT 9
M Kollisionensbehandlung mit JavaFX AWT, Swing, JavaFX & SWT 1
N JavaFX - Toolkit not initialized AWT, Swing, JavaFX & SWT 6
G JavaFX , Duplicate erzeugt aber ich weis nicht wo AWT, Swing, JavaFX & SWT 4
K Javafx Plugin (javafx:jlink) mit moditect Plugin nutzen ... AWT, Swing, JavaFX & SWT 5
J Saubere Trennung Model, View, Controller Javafx AWT, Swing, JavaFX & SWT 10
G JavaFX BarChart während der Runtime aktualisieren AWT, Swing, JavaFX & SWT 4
Z JavaFX JavaFX Spinner AWT, Swing, JavaFX & SWT 1
N JavaFX Tableview nach Löschen von Element falscher Index AWT, Swing, JavaFX & SWT 4
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
T JavaFX DatePicker JavaFX AWT, Swing, JavaFX & SWT 14

Ähnliche Java Themen

Neue Themen


Oben