JavaFX Automatisches Aktualisieren der Seite

MaPaper

Mitglied
Hallo Zusammen,
ich habe eine kurze und kleine Frage ich habe schon öfter mit JavaFX gearbeitet, leider reicht hier mein Anfängerwissen nicht aus....
Ich habe ein kleines Programm, dass Daten aus einer Datenbank abfragt. Hier kommen unregelmäßig Datensätze für die Anzeigen. Momentan hab ich das alles über einen Button gelöst bzw. mit einem MouseEvent, dass sich bei Klick die neusten Daten holt. Dies soll nun umgestellt werden auf alle 10 Sekunden. Ich habe das kleine Programm in einer MVC Struktur aufgebaut.
Nun zur eigentlichen Frage. Gibt es einen Eventhandler, der hochzählt und dementsprechend nach 10 Sekunden einfach die Aktionen die dort angegeben sind wieder ausführt? Im Internet bin ich nicht ganz fündig geworden. Geb ich sowas in die Richtung ein, finde ich nur Lösungen, die sich auf animierte Timer beziehen....
Also wie gesagt statt einem händisch ausgelösten refresh einfach einen Intervall ausgeführten Timer der alle 10 Sekunden die Statements neu absetzt und den Text aktualisiert. Ich bin für jeden Tipp dankbar! Schon mal vielen Dank im voraus.

LG
 

dzim

Top Contributor
Ist aber notwendig zu bemerken, das Tomas nicht empfiehlt, Netzwerk-Operation (oder ähnliche Zeitintensive Dinge) über eine Timeline zu machen:
It is not a good idea to execute time consuming operations (like network I/O) on the JavaFX application thread. As a corollary, it is not a good idea to use FxTimer to schedule such tasks.
#edit: Warum? Nun ja, die KeyFrames einer Timeline laufen auf dem UI-Thread - sie können also im schlimmsten Fall dein UI einfrieren lassen.

Daher: Vielleicht einen ScheduledExecutorService verwenden (siehe verlinktes Beispiel). Dann nur daran denken, dass UI-Updates dann auf them UI-Thread gemacht werden müssen (über Platform#runLater).
Oder als weitere Alternative (die ich schon fast vergessen habe): Die gute alte Timer-Klasse! Siehe hier: https://stackoverflow.com/questions/9966136/javafx-periodic-background-task
 

MaPaper

Mitglied
Erst einmal Danke! Diesen Artikel hab ich jetzt erstmal verwendet. Soweit klappt das auch nur das Problem liegt an einer NullPointerException. Was aber nicht wirklich sein kann, da bei dem Statement auch Daten hinterlegt werden und vorallem über die händische Aktualisierung kommen die Daten einwandfrei durch ich stelle gerne den Code bereit, wenn dies noch gewünscht ist. Den kommentar hab ich auch unten gelesen.... ich bin jetzt ein bisschen hin und her gerissen, ob ich die andere verlinkte Methode probieren soll oder weiter an dieser...
 

MaPaper

Mitglied
Also ich habe mich jetzt einfach für die Timerklasse von Stackoverflow entschieden. Einfach aus der Tendez raus dass die andere Methode nicht für so etwas vorgesehen ist. Aber der NullPointerFehler tritt weiterhin auf. ich poste den Code jetzt einfach mal hier.

Hier wäre die Main:
Java:
public class Main extends Application {



    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load( getClass().getResource( "View.fxml" ) );
        primaryStage.setTitle( "Paper2kView" );
        primaryStage.setScene( new Scene( root, Double.MAX_VALUE, Double.MAX_VALUE ) );
        primaryStage.show();
        Timeline fiveSecondsWonder = new Timeline(new KeyFrame(Duration.seconds(5), new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                Controller aktualisieren = new Controller();
                aktualisieren.aktualisieren();
            }
        }));
        fiveSecondsWonder.setCycleCount(Timeline.INDEFINITE);
        fiveSecondsWonder.play();
        
        /*
        Controller aktualisieren = new Controller();
        Timeline timeline = new Timeline(new KeyFrame(
                Duration.millis(2500),
                ae -> aktualisieren.aktualisieren()));
        timeline.setCycleCount(Animation.INDEFINITE);
        timeline.play();
         */

    }



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

}

Dann die Klasse aktualisieren, die dann dementsprechend das Statement an den DBConnector (der händisch einwandfrei mit dem selben Programmcode funktioniert)
Java:
public NumberFormat numberFormat = new DecimalFormat( "0.0" );


    public  void aktualisieren() {
        DateFormat dateFormat = new SimpleDateFormat( "dd.MM.yyyy" ); // Format für 24-Stunden-Anzeige
        String str = dateFormat.format( new Date() );

        String bruttoproduktion = DBConnector.DBConnector( "select sum(gewicht) from TAMBOURDATEN t where wiegedat = '"+ str +"' and maschnr = 'PM67'", "sum(gewicht)" );
        double tonnen;
        if (bruttoproduktion == null) {
            tonnen = 0;
        } else {
            tonnen = Double.valueOf( bruttoproduktion );
            tonnen = tonnen / 1000;
        }
        numberFormat.setRoundingMode( RoundingMode.DOWN );
        txtlabelbr7.setText( String.valueOf( numberFormat.format( tonnen ) ) );


        String nettoproduktion = DBConnector.DBConnector( "select sum(gewicht) from ROLB t where wiegedat = '" + str + "' and maschnr = 'UR07' and lager = '5000'", "sum(gewicht)" );
        if (nettoproduktion == null) {
            tonnen = 0;
        } else {
            tonnen = Double.valueOf( nettoproduktion );
            tonnen = tonnen / 1000;
        }
        numberFormat.setRoundingMode( RoundingMode.DOWN );
        txtlabelnt7.setText( String.valueOf( numberFormat.format( tonnen ) ) );


        String prueflager = DBConnector.DBConnector( "select sum(gewicht) from ROLB t where wiegedat = '" + str + "' and maschnr = 'UR07' and lager <> 5000", "sum(gewicht)" );
        if (prueflager == null) {
            tonnen = 0;
        } else {
            tonnen = Double.valueOf( prueflager );
            tonnen = tonnen / 1000;
        }
        numberFormat.setRoundingMode( RoundingMode.DOWN );
        txtlabelp7.setText( String.valueOf( numberFormat.format( tonnen ) ) );
    }

Die Fehler die Periodisch alle 5 Sekunden kommen geb ich euch natürlich auch mit:
Code:
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
    at MVC.Controller.aktualisieren(Controller.java:36)
    at MVC.Main$1.handle(Main.java:33)
    at MVC.Main$1.handle(Main.java:28)
    at javafx.graphics/com.sun.scenario.animation.shared.TimelineClipCore.visitKeyFrame(TimelineClipCore.java:239)
    at javafx.graphics/com.sun.scenario.animation.shared.TimelineClipCore.playTo(TimelineClipCore.java:180)
    at javafx.graphics/javafx.animation.Timeline.doPlayTo(Timeline.java:177)
    at javafx.graphics/javafx.animation.AnimationAccessorImpl.playTo(AnimationAccessorImpl.java:39)
    at javafx.graphics/com.sun.scenario.animation.shared.InfiniteClipEnvelope.timePulse(InfiniteClipEnvelope.java:110)
    at javafx.graphics/javafx.animation.Animation.doTimePulse(Animation.java:1101)
    at javafx.graphics/javafx.animation.Animation$1.lambda$timePulse$0(Animation.java:186)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
    at javafx.graphics/javafx.animation.Animation$1.timePulse(Animation.java:185)
    at javafx.graphics/com.sun.scenario.animation.AbstractMasterTimer.timePulseImpl(AbstractMasterTimer.java:344)
    at javafx.graphics/com.sun.scenario.animation.AbstractMasterTimer$MainLoop.run(AbstractMasterTimer.java:267)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:515)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:499)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(QuantumToolkit.java:492)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$11(QuantumToolkit.java:320)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:835)

So und mich wundert es nur, dass es händisch funktioniert und per periodischen Aufruf nicht... ich rufe ein und die selbe Klasse auf nur über einen anderen EventHandler natürlich.
Und wirklich wirklich Danke schon mal für die vorausgegangen Tipps diese haben sehr geholfen.
 

dzim

Top Contributor
Keine Ahnung: Was ist Zeile 36 denn? Der DBConnector-Aufruf (Methoden übrigens immer mit Lower Camel Case)?
 

mihe7

Top Contributor
das Problem liegt an einer NullPointerException. Was aber nicht wirklich sein kann,
Da darfst Du der JVM ruhig glauben. Meine Vermutung wäre, dass die txtlabel-Teile null sind. Um mal weiter in der Glaskugel zu suchen, würde ich fast meinen, dass Du im Controller @FXML-Annotationen hast, die aber nicht injected werden, weil Du mit new den Controller erzeugst.
 

Robat

Top Contributor
BTW: Ich kenne die DBConnector-Klasse nicht, aber: Du solltest niemals Query-Strings händisch zusammen bauen. Besonders dann nicht, wenn Teile der Query aus einer Eingabe des Nutzers bestehen. Nutze dazu lieber PreparedStatements. Wieso, weshalb, warum? Stichwort: SQL-Injection
 

dzim

Top Contributor
Ich nehme auch an, dass hier ein Label oder so nicht gesetzt ist. Vermutlich wird der Timer das erste Mal gefeuert, bevor das UI initialisiert ist. Am Besten wäre es wohl, den Timer erst zu starten, wenn das UI durch seinen abschliessenden Layout-Cycle durch ist.

Variante 1: Der Controller feuert ein Event, auf dass das Main-UI hört und erst dann den Timer startet (z.B. wenn die #initialize Methode des Controllers durch ist).

Variante 2: Der Controller selbst startet den Timer. Man könnte den ja auch irgendwo als Singleton hinterlegen - nein, ich meine nicht eine Singleton-Klasse, da die ja pöse ist, sondern eher so ein zentrales Model oder so, dass per Dependency Injection reingereicht wird. Beispiele gibt es hier im Forum ja zur genüge.

Variante 3: Im Main-UI hat man ja das Pane, dass man anzeigt (Parent root = ...). Darauf einen Layout-Changed-Listener machen, überprüfen, dass Höhe und Breite > 0 sind, dann den Timer starten...
 

MaPaper

Mitglied
Keine Ahnung: Was ist Zeile 36 denn? Der DBConnector-Aufruf (Methoden übrigens immer mit Lower Camel Case)?
Also um mal langsam anzufangen.... Erstmal Danke für die tollen Hinweise und Kritikpunkte! :)
Zeile 36 der Aufruf des DB Connectors ist eigentlich nichts anderes Als ne Try Catch Geschichte zum Laden der Treiber, aufbauen der Verbindung, Absetzen des hier abgebildeten Statements und Rückgabe des Return Werts dieser Return ist immer nur ein einziger Wert. Mehr passiert in DB Connectors auch nicht.

Da darfst Du der JVM ruhig glauben. Meine Vermutung wäre, dass die txtlabel-Teile null sind. Um mal weiter in der Glaskugel zu suchen, würde ich fast meinen, dass Du im Controller @FXML-Annotationen hast, die aber nicht injected werden, weil Du mit new den Controller erzeugst.
Naja für des hätte ich eigentlich die NULL überprüfung eingebaut. Sobald also die Datenbank den Wert NULL zurückgibt, wird der Wert händisch auf 0 gesetzt und der sollte ja normalerweise kein Problem sein, wenn er angezeigt wird. Da hast du absolut Recht mit deiner Annahme, weil ich sonst die Label nicht in der class Controller verwenden konnte aus irgendwelchen Gründen.... in dem Eventhandler mit dem Klick geht des einwandfrei.... Vielleicht hab ich hier aus Unwissenheit einen Fehler gemacht und der ruft dieses Problem hervor bei der Erzeugung der neuen Controller Klasse. Dann hier meine Gegenfrage wie kann ich den das Label mit der @FXML Annotation haben und es gleichzeitig überall in der Controller Klasse verwenden ohne dass es ein maschinell erzeugter Handler ist?

Ich nehme auch an, dass hier ein Label oder so nicht gesetzt ist. Vermutlich wird der Timer das erste Mal gefeuert, bevor das UI initialisiert ist. Am Besten wäre es wohl, den Timer erst zu starten, wenn das UI durch seinen abschliessenden Layout-Cycle durch ist.

Variante 1: Der Controller feuert ein Event, auf dass das Main-UI hört und erst dann den Timer startet (z.B. wenn die #initialize Methode des Controllers durch ist).

Variante 2: Der Controller selbst startet den Timer. Man könnte den ja auch irgendwo als Singleton hinterlegen - nein, ich meine nicht eine Singleton-Klasse, da die ja pöse ist, sondern eher so ein zentrales Model oder so, dass per Dependency Injection reingereicht wird. Beispiele gibt es hier im Forum ja zur genüge.

Variante 3: Im Main-UI hat man ja das Pane, dass man anzeigt (Parent root = ...). Darauf einen Layout-Changed-Listener machen, überprüfen, dass Höhe und Breite > 0 sind, dann den Timer starten...
Das wusste ich so jetzt nicht, dass es an sowas liegen kann. Vielleicht sollte ich das Problem mit der Annotation in den Griff bekommen und schauen ob es dann funktioniert, falls nicht in diese Richtung weiterschauen.

Habt ihr eine Idee wie ich das mit der Annotation in den Griff kriege?

Ach ja und ich bedanke mich nochmals bei euch! Es ist ein Segen dass ihr jemanden helft, der vielleicht ein bisschen rumgespielt hat und dabei fundamentale Fehler macht.

VG
 

MaPaper

Mitglied
Korrektur. Ich hab die Label neu erzeugen lassen. Jetzt hat es funktioniert, komischerweise also ich konnte das Static entfernen und habe jetzt auch das FXML Tag dahinter. Die Fehlermeldung ist jetzt eine "andere". Dazu sei auch zu sagen, dass er den Fehler beim ersten Wert wirft und sich danach den zweiten holt und diesen auch bekommt.... Der Wert unten im Fehler ist sozusagen schon der zweite Wert... Ich bin bloß irgendwie ratlos, weil beim händischen aktualisieren, funktioniert es einwandfrei mit allen Werten, also in dem Statement kommt sozusagen kein NULL von der DB zurück.
Code:
69200
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
    at MVC.Controller.aktualisieren(Controller.java:37)
    at MVC.Main$1.handle(Main.java:29)
    at MVC.Main$1.handle(Main.java:24)
    at javafx.graphics/com.sun.scenario.animation.shared.TimelineClipCore.visitKeyFrame(TimelineClipCore.java:239)
    at javafx.graphics/com.sun.scenario.animation.shared.TimelineClipCore.playTo(TimelineClipCore.java:180)
    at javafx.graphics/javafx.animation.Timeline.doPlayTo(Timeline.java:177)
    at javafx.graphics/javafx.animation.AnimationAccessorImpl.playTo(AnimationAccessorImpl.java:39)
    at javafx.graphics/com.sun.scenario.animation.shared.InfiniteClipEnvelope.timePulse(InfiniteClipEnvelope.java:110)
    at javafx.graphics/javafx.animation.Animation.doTimePulse(Animation.java:1101)
    at javafx.graphics/javafx.animation.Animation$1.lambda$timePulse$0(Animation.java:186)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
    at javafx.graphics/javafx.animation.Animation$1.timePulse(Animation.java:185)
    at javafx.graphics/com.sun.scenario.animation.AbstractMasterTimer.timePulseImpl(AbstractMasterTimer.java:344)
    at javafx.graphics/com.sun.scenario.animation.AbstractMasterTimer$MainLoop.run(AbstractMasterTimer.java:267)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:515)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:499)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(QuantumToolkit.java:492)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$11(QuantumToolkit.java:320)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:835)

Der erste Wert wird noch übergeben und beim zweiten Wert spuckt er dann den Fehler... Vielleicht muss ich noch eine Pause einbauen....
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Dann hier meine Gegenfrage wie kann ich den das Label mit der @FXML Annotation haben und es gleichzeitig überall in der Controller Klasse verwenden ohne dass es ein maschinell erzeugter Handler ist?
Vorab (das hab ich aus Deiner Antwort rausgekürzt): es geht nicht um die Datenbank.

Was heißt maschinell erzeugter Handler?

Mal abstrakt: Du hast eine textuelle Beschreibung Deiner GUI in Form einer XML-Datei (FXML). Das Framework verarbeitet diese Datei und erstellt entsprechende Objekte. Wenn Du in der FXML-Datei eine Controllerklasse angibst, dann wird für Dich auch ein Controller-Objekt erstellt. Dabei versucht das Framework zuvor erzeugte Objekte mit @FXML-annotierten Variablen des Controllers zu "verbinden". Gelingt dies, kann über die Variable auf das betreffende UI-Element zugegriffen werden.

Nehmen wir mal die schemenhaft dargestellte FXML-Datei:
XML:
<GridPane fx:controller="org.javaforum.mihe7.TestController" xmlns:fx="http://javafx.com/fxml">
    <Label text="Welcome" 
        GridPane.columnIndex="0" GridPane.rowIndex="0" />
    <Button fx:id="sayButton" text="Say it!" 
        GridPane.columnIndex="0" GridPane.rowIndex="1" />
</GridPane>
Außerdem TestController.java:
Java:
package org.javaforum.mihe7;

public class TestController {
    @FXML
    private Button sayButton; // Name entspricht fx:ix im FXML
 
    // usw ...
    public void printButtonClass() {
        System.out.println(sayButton.getClass().getName());
    }
}
Das Framework erzeugt nun aus dem FXML nicht nur ein GridPane, ein Label und einen Button, sondern auch einen TestController (s. fx:controller-Attribut). In diesem findet es einen mit @FXML annotierten Button, dessen Variablenname mit der fx:id des Buttons aus der FXML übereinstimmt. Die Variable sayButton wird daher auf das zuvor erstellte Button-Objekt gesetzt. Damit kann im Controller auf den Button ganz normal zugegriffen werden.

Würde man also die Methode printButtonClass auf der vom Framework erstellten TestController-Instanz aufrufen, würde das funktionieren.

Wenn Du aber mit new selbst eine Instanz der TestController-Klasse erzeugst, bekommt das Framework davon nichts mit. Es wird nichts verbunden und sayButton bleibt null. D. h.
Java:
TestController controller = new TestController();
controller.printButtonClass();
würde zu einer NullPointerException führen.
 

MaPaper

Mitglied
Oh Gott sorry!!! Also ich weiß wie das funktioniert. Sorry wenn des jetzt so rüberkam. Ich hab schon ein zwei Sachen mit JavaFX und SceneBuilder gemacht. Ich hab eben die Annotation bloß entfernt weil ich darauf nicht zugreifen kann. Dies hab ich geändert und im Beitrag ergänzt. Ich versteh aber absolut was du mir versuchst zu erklären.

Java:
txtlabelnt7.setText( String.valueOf( numberFormat.format( tonnen ) ) ); txtlabelnt7: null numberFormat: DecimalFormat@3995 tonnen: 86.388
Hier der Auszug aus dem Debugger. Ich glaube du hast mit deiner Annahme absolut recht, dass das Label nicht vom Framework herkommt sondern einfach mit NULL dasteht. Bloß wie kann ich von der Main auf die Funktion im Controller zugreifen und dies mit dem Framework? Muss ich den Eventhandler in den Controller schreiben? Oder muss dies wie ichs oben gemacht hab in die Main reinschreiben?
 

mihe7

Top Contributor
Oh Gott sorry!!! Also ich weiß wie das funktioniert. Sorry wenn des jetzt so rüberkam.
Alles gut. Wenn ich den Stand nicht kenne, dann fange ich lieber etwas weiter vorne an, um Verwirrungen zu vermeiden.

Bloß wie kann ich von der Main auf die Funktion im Controller zugreifen und dies mit dem Framework?

Java:
FXMLLoader loader = new FXMLLoader(getClass().getResource( "View.fxml"));
Controller controller = loader.getController();
Parent root = loader.load();
...
 

MaPaper

Mitglied
Alles gut. Wenn ich den Stand nicht kenne, dann fange ich lieber etwas weiter vorne an, um Verwirrungen zu vermeiden.



Java:
FXMLLoader loader = new FXMLLoader(getClass().getResource( "View.fxml"));
Controller controller = loader.getController();
Parent root = loader.load();
...

Super! Wahnsinnig tolle Hilfe!
Also hier mal meine Main zum jetzigen Stand
Java:
 @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load( getClass().getResource( "View.fxml" ) );
        primaryStage.setTitle( "Paper2kView" );
        primaryStage.setScene( new Scene( root, Double.MAX_VALUE, Double.MAX_VALUE ) );
        primaryStage.show();
        Timeline fiveSecondsWonder = new Timeline(new KeyFrame(Duration.seconds(5), new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                FXMLLoader loader = new FXMLLoader(getClass().getResource( "View.fxml"));
                Controller controller = loader.getController();
                Parent root = loader.load();
                controller.aktualisieren();
            }
        }));
        fiveSecondsWonder.setCycleCount(Timeline.INDEFINITE);
        fiveSecondsWonder.play();

Er schmeißt mir nun den Fehler: Error:(30, 42) java: unreported exception java.io.IOException; must be caught or declared to be thrown
Tut mir leid dass ich da auf euer Wissen zugreifen muss. So tief bin ich da jetzt nicht drin also nur mal so um meinen Gedankengang zu erklären.
Ich schätze mal dass in den ersten zwei Zeilen die Instanz mit den dementsprechenden Resourcen des Frameworks geladen werden. Nur ich verstehe die Parent root = loader.load(); Zeile nicht ganz. Er unterstreicht nämlich das .load mit der obenstehenden Fehlermeldung...
Sorry dass ich mich gerade so anstelle....
 

mihe7

Top Contributor
Java:
   public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(getClass().getResource( "View.fxml"));
        final Controller controller = loader.getController();
        Parent root = loader.load();
        primaryStage.setTitle( "Paper2kView" );
        primaryStage.setScene( new Scene( root, Double.MAX_VALUE, Double.MAX_VALUE ) );
        primaryStage.show();
        Timeline fiveSecondsWonder = new Timeline(new KeyFrame(Duration.seconds(5), new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                controller.aktualisieren();
            }
        }));
// usw.
    }
 

MaPaper

Mitglied
Also es läuft vom Compilen her, allerdings schmeißt er immer noch den selben Fehler wie zuvor immer noch eine Java.lang.NullPointerException. in Zeile 30 sprich in der controller.aktualisieren(); Ich schau mir jetzt noch mal den Debug Vorgang an....
Mal eine ganz blöde Frage was müsste den reintheoretisch für ein Wert für das Label hinterlegt sein im Programm? Bevor ich den Wert auf das Label pressen will, hat er den Wert NULL (wie oben im Vorgang bereits dargestellt). Deshalb die Frage was müsste da eigentlich für Wert hinterlegt sein? 0 1 oder irgendwelche Speichernummern?
Ach ja und wie immer Vielen Vielen Dank!

VG
 

MaPaper

Mitglied
Hier noch ein kleiner Nachtrag vom Debug:
11887

Er kommt gar nicht dazu in den Controller zu springen..... kann man diese Controller Klasse den irgendwie initalisieren?
Also jetzt bin ich wirklich im Land der Nullchecker angekommen... Ich hab ja schon viele Programme gesehen die ich nicht verstehe aber mit diesen Grafischen Oberflächen mehr als Drag&Drop ist da bei mir echt nicht viel zu holen^^
 

dzim

Top Contributor
Nehmen wir mal die schemenhaft dargestellte FXML-Datei:
XML:
<GridPane fx:controller="org.javaforum.mihe7.TestController" xmlns:fx="http://javafx.com/fxml">
<Label text="Welcome"
GridPane.columnIndex="0" GridPane.rowIndex="0" />
<Button fx:id="sayButton" text="Say it!"
GridPane.columnIndex="0" GridPane.rowIndex="1" />
</GridPane>
Außerdem TestController.java:
Java:
package org.javaforum.mihe7;

public class TestController {
@FXML
private Button sayButton; // Name entspricht fx:ix im FXML

// usw ...
public void printButtonClass() {
System.out.println(sayButton.getClass().getName());
}
}
Wichtig ist, dass du den Controller im FXML auch einträgst. -> org.javaforum.mihe7.TestController ersetzen durch deinen Controller...
 

MaPaper

Mitglied
Wichtig ist, dass du den Controller im FXML auch einträgst. -> org.javaforum.mihe7.TestController ersetzen durch deinen Controller...

Der sitzt. Ich habe den über den Scene Builder eingetragen.... In meinem Fall heißt das Package MVC und der Controlller: Controller also sprich MVC.Controller
Hier ein kurzer Blick in die FXML
XML:
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="1186.0" prefWidth="1618.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="MVC.Controller">
   <center>
Also des müsste passen.
Nur um des Problem mal zusammenzufassen korrigiert mich bitte wenn ich falsch liege.
Ich schreibe meine normale Events in den Controller, wie zum Beispiel den Button den ich momentan händisch zum Aktualisieren benutze. Funktioniert auch einwandfrei.
Diesen Timer schreibe ich allerdings in die Main, obwohl es ein Event ist, da er natürlich ausgeführt werden soll ohne irgendwas zu machen.
Nun hab ich aber das Problem, dass die Funktion mithilfe einer neuen Instanz auf den Controller, in dem sich die Werte der Instanz nicht befindet zugreift, dadurch habe ich einen NULL Pointer und es wirft mir alles durcheinander. Mit der Methode von Mihe7 sollte dies aber nun eigentlich gehen.... da ich ja explizit die Resourcen lade.

Wie gesagt korrigiert mich wenn ich hier irgendwo vom Verständnis falsch liege, will ja den Fehler beheben und dazu muss ich ihn erst verstehen :)
Wie immer vielen Dank für alles!
 

MaPaper

Mitglied
Bin mir grad unsicher, aber: Der Controller darf doch auch sicherlich erst nach dem Laden geholt werden, oder?
EIN SCHUSS EIN TREFFER! Das wars! Es haut hin
Einfach nur zwei Zeilen vertauscht und fertig
Java:
 @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader( getClass().getResource( "View.fxml" ) );
        Parent root = loader.load();
        final Controller controller = loader.getController();
        primaryStage.setTitle( "Paper2kView" );
        primaryStage.setScene( new Scene( root, Double.MAX_VALUE, Double.MAX_VALUE ) );
        primaryStage.show();
        Timeline fiveSecondsWonder = new Timeline( new KeyFrame( Duration.seconds( 5 ), new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent event) {
                controller.aktualisieren();
            }
        } ) );
        fiveSecondsWonder.setCycleCount( Timeline.INDEFINITE );
        fiveSecondsWonder.play();

TAUSEND DANK an alle! Kann ich das Thema irgendwie als gelöst kennzeichnen oder mich euch irgendwie erkenntlich zeigen? Durch ein Vote oder so etwas?
Vg
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
news2swen automatisches erstellen eines Languagefiles AWT, Swing, JavaFX & SWT 1
N "Automatisches" erstellen von jButtons AWT, Swing, JavaFX & SWT 1
Thallius Automatisches Scrollen zum aktiven JTextView klappt nicht AWT, Swing, JavaFX & SWT 2
J JavaFX Automatisches Neuzeichnen ("Repaint") abstellen. AWT, Swing, JavaFX & SWT 10
K Swing Automatisches "Packen" beim "Neu-Painten" AWT, Swing, JavaFX & SWT 2
V automatisches neuzeichnen verhindern AWT, Swing, JavaFX & SWT 3
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
K Automatisches schliessen eines Dialogs AWT, Swing, JavaFX & SWT 4
P Automatisches Mitscrollen der ScrollPane AWT, Swing, JavaFX & SWT 2
S Automatisches Rendern einen JPanels AWT, Swing, JavaFX & SWT 8
G Weiches automatisches verschieben eines JSplitPane-Dividers? AWT, Swing, JavaFX & SWT 3
V Automatisches Scrollen bei JScrollPane AWT, Swing, JavaFX & SWT 10
S Automatisches Scrollen in einer JTextArea AWT, Swing, JavaFX & SWT 6
C Default table model aktualisieren AWT, Swing, JavaFX & SWT 7
G JavaFX BarChart während der Runtime aktualisieren AWT, Swing, JavaFX & SWT 4
T TableView aktualisieren AWT, Swing, JavaFX & SWT 1
W JavaFX TableView aktualisieren AWT, Swing, JavaFX & SWT 1
D JavaFX Label flackert beim aktualisieren AWT, Swing, JavaFX & SWT 12
J Swing JLabel Verknüpfung aktualisieren AWT, Swing, JavaFX & SWT 3
J JavaFX Label aktualisieren AWT, Swing, JavaFX & SWT 18
M Muss man die ObservableList aktualisieren? AWT, Swing, JavaFX & SWT 3
B Bounds aller Panels aktualisieren AWT, Swing, JavaFX & SWT 0
-DD Lobby/Spielerliste aktualisieren bei Suche AWT, Swing, JavaFX & SWT 1
T JFrame aktualisieren AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing JTable aktualisieren AWT, Swing, JavaFX & SWT 5
H JavaFX - Label aktualisieren AWT, Swing, JavaFX & SWT 1
D JTable nach INSERT aktualisieren /refreshen AWT, Swing, JavaFX & SWT 1
S Swing Mal wieder JTable Ansicht aktualisieren AWT, Swing, JavaFX & SWT 10
Z jLabel von Methode aus aktualisieren AWT, Swing, JavaFX & SWT 7
J JTextfield automatisch aus zweiter Klasse aktualisieren AWT, Swing, JavaFX & SWT 5
J Tableview Daten hinzufügen und aktualisieren AWT, Swing, JavaFX & SWT 5
lumpigerAffe Swing Jframe aktualisieren AWT, Swing, JavaFX & SWT 27
R Swing Durch JComboBox-Item eine TextArea aktualisieren AWT, Swing, JavaFX & SWT 2
C JavaFX TreeTableView aktualisieren AWT, Swing, JavaFX & SWT 10
R GUI Element in einer Methode aktualisieren (JTextPane) AWT, Swing, JavaFX & SWT 13
thobren JavaFX textarea nach setPrefRowCount Ansicht aktualisieren AWT, Swing, JavaFX & SWT 1
Regedit JavaFX Java Canvas hört ständig auf zu aktualisieren/malen AWT, Swing, JavaFX & SWT 3
W Swing JLabel jede Sekunde aktualisieren, ohne Timer zu benutzen AWT, Swing, JavaFX & SWT 4
H Combobox aktualisieren AWT, Swing, JavaFX & SWT 2
A JFace/SWT: ListViewer Inhalt nach Selection in zweitem List Viewer aktualisieren! AWT, Swing, JavaFX & SWT 5
L GUI - Jpanel - Splitpane will nicht aktualisieren AWT, Swing, JavaFX & SWT 4
2 Zeit Differenz automatisch aktualisieren AWT, Swing, JavaFX & SWT 1
N JavaFX Stage aktualisieren AWT, Swing, JavaFX & SWT 5
A JComboBox mit Array aktualisieren AWT, Swing, JavaFX & SWT 7
S Swing JComboBox mit Listener aktualisieren AWT, Swing, JavaFX & SWT 13
O Statusleiste mit JLabel aktualisieren AWT, Swing, JavaFX & SWT 5
J JLabel während einer methode aktualisieren AWT, Swing, JavaFX & SWT 6
AssELAss Verzeichnis JFileChooser aktualisieren AWT, Swing, JavaFX & SWT 0
R AWT JLabel oder JButton aktualisieren AWT, Swing, JavaFX & SWT 1
T Int-Wert aktualisieren? AWT, Swing, JavaFX & SWT 9
A Swing JTextArea aus anderer Klasse in realtime aktualisieren AWT, Swing, JavaFX & SWT 3
S Combobox aktualisieren AWT, Swing, JavaFX & SWT 3
M Swing Aktualisieren eines JPanels nach Tasteneingabe AWT, Swing, JavaFX & SWT 2
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
J GUI/Random aktualisieren? AWT, Swing, JavaFX & SWT 3
T JtextPane Zeile aktualisieren AWT, Swing, JavaFX & SWT 3
P Swing Aktualisieren von JFrame in einem onClick-Ereignis AWT, Swing, JavaFX & SWT 11
B JTable aktualisieren AWT, Swing, JavaFX & SWT 22
K SWT DataBinding, Anzahl der Zeilen aktualisieren AWT, Swing, JavaFX & SWT 4
G JRadioButton aktualisieren nicht... AWT, Swing, JavaFX & SWT 10
C ToolTip aktualisieren AWT, Swing, JavaFX & SWT 2
D Swing JComboBox aktualisieren AWT, Swing, JavaFX & SWT 4
C TextFeld in Verbindung zur ComboBox automatisch aktualisieren AWT, Swing, JavaFX & SWT 7
J JList, Anzeige aktualisieren AWT, Swing, JavaFX & SWT 7
S Inhalt einer JComboBox aktualisieren AWT, Swing, JavaFX & SWT 6
M Swing JScrollPane (Parent JTextArea) aktualisieren + neue Zeile AWT, Swing, JavaFX & SWT 5
A Swing Aktualisieren eines JPanels AWT, Swing, JavaFX & SWT 13
A JButton in einem Array aktualisieren AWT, Swing, JavaFX & SWT 8
Kenan89 JTable aktualisieren AWT, Swing, JavaFX & SWT 21
B Swing Fensterinhalt aktualisieren AWT, Swing, JavaFX & SWT 11
S Spezielle komponente aktualisieren AWT, Swing, JavaFX & SWT 9
V Swing JProgressBar aktualisieren AWT, Swing, JavaFX & SWT 14
C Combobox bei Tabellenänderung mit aktualisieren AWT, Swing, JavaFX & SWT 11
C jTable aktualisieren AWT, Swing, JavaFX & SWT 2
M TabbpedPane Anzeige aktualisieren AWT, Swing, JavaFX & SWT 6
X Swing JTree aktualisieren AWT, Swing, JavaFX & SWT 2
P AWT Fenster aktualisieren, nachdem ich JComboBox ändere AWT, Swing, JavaFX & SWT 9
D JTree nach Klick auf einen Hyperlink aktualisieren AWT, Swing, JavaFX & SWT 3
D Elternfenster vom JDialog aktualisieren oder nicht ? AWT, Swing, JavaFX & SWT 7
O JFrame: Daten alle paar Sekunden aktualisieren AWT, Swing, JavaFX & SWT 3
M Swing JLabel (mit einer Grafik) aktualisieren AWT, Swing, JavaFX & SWT 2
S JTable - Aktualisieren / Neu zeichnen. AWT, Swing, JavaFX & SWT 5
C Daten aus DB -> JTable aktualisieren klappt nicht AWT, Swing, JavaFX & SWT 16
M Zeichnung aktualisieren AWT, Swing, JavaFX & SWT 3
D Swing JTextField aus anderer Klasse aktualisieren AWT, Swing, JavaFX & SWT 2
L GUI aktualisieren? AWT, Swing, JavaFX & SWT 4
X Tabelle während Funktionsaufruf aktualisieren AWT, Swing, JavaFX & SWT 11
V Panel/Icon aktualisieren AWT, Swing, JavaFX & SWT 10
R JFreeChart aktualisieren wenn sich die Ausgangsdaten ändern AWT, Swing, JavaFX & SWT 8
M Swing Aktualisieren von laufenden Anwendungen AWT, Swing, JavaFX & SWT 10
C Swing Inhalt einer JTable aktualisieren und filten nach Feldern die nicht in der Tabelle sind AWT, Swing, JavaFX & SWT 3
S Swing Probleme beim Aktualisieren einer JComboBox nach Auswahländerung AWT, Swing, JavaFX & SWT 2
J JLabel aktualisieren AWT, Swing, JavaFX & SWT 8
N Swing MainWindow(JFrame) aktualisieren(neuzeichnen) repaint AWT, Swing, JavaFX & SWT 4
K Swing JTable Model aktualisieren AWT, Swing, JavaFX & SWT 2
K LayoutManager Borderlayout - NORTH aktualisieren AWT, Swing, JavaFX & SWT 10
C JMenuBar aktualisieren? AWT, Swing, JavaFX & SWT 2
K JTable aktualisieren AWT, Swing, JavaFX & SWT 9
M JFrame aktualisieren/refreshen? AWT, Swing, JavaFX & SWT 4
A Haupt JFrame inkl. aller Komponenten aktualisieren? AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben