JavaFX Label aktualisieren

Diskutiere JavaFX Label aktualisieren im AWT, Swing, JavaFX & SWT Bereich.
J

julius0205

Hallo, ich will mit Java FX ein Programm schreiben welches immer die aktuelle Zeit angibt. (Habe das bisschen abgeändert dass die Zeit in Worten oder Binärcode ausgegeben wird, ist aber in einer Methode)
Jetzt will ich es schaffen dass mein Label "time" beim Programmstart jede Minute aktualisiert wird. (kenne das nur durch ein ActionEvent z.b Button)
Kann mir da jemand helfen?
Bis jetzt ist das so:

Main:
Java:
package interface_gui;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Control;
import javafx.scene.image.Image;
import javafx.stage.Stage;

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Words of Time");
primaryStage.getIcons().add(new Image(Main.class.getResourceAsStream("uhr.png")));
primaryStage.setScene(new Scene(root));
primaryStage.show();
}


public static void main(String[] args) throws InterruptedException {
launch(args);
}
}
Controller:
Java:
package interface_gui;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.control.Label;

public class Controller {
public static Label time;


}
Zeit-methode:
Java:
package interface_gui;

import java.text.SimpleDateFormat;
import java.util.Date;

public class timeinwords extends Controller {
public static int intHour;
public static int intMinute;
public static int intSecond;
public static int inputTime;

public static void getTime() throws InterruptedException {
String newTime = Hour() + Minute();
}

public static String Hour() {
SimpleDateFormat sdfHour = new SimpleDateFormat("HH");
String timeHour = sdfHour.format(new Date());
intHour = Integer.parseInt(timeHour);
//System.out.print(Integer.toBinaryString(intHour) + " ");
inputTime = intHour;
if (intHour % 10 == 0) {
return (zehner() + " Uhr ");
} else {
return (under20() + " Uhr ");
}
}

public static String Minute() {
SimpleDateFormat sdfMinutes = new SimpleDateFormat("mm");
String timeMinutes = sdfMinutes.format(new Date());
intMinute = Integer.parseInt(timeMinutes);
inputTime = intMinute;
if (intMinute % 10 == 0) {
return (zehner());
} else {
return (under20());
}
//System.out.print(Integer.toBinaryString(intMinute) + " ");
//System.out.println(intMinute);
}
fxml:

Code:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>


<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: #28abfa;" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="interface_gui.Controller">
<children>
<Label fx:id="time" layoutX="241.0" layoutY="180.0" text="test" textFill="WHITE">
<font>
<Font name="Arial Bold" size="35.0" />
</font>
</Label>
</children>
</AnchorPane>
 
L

lam_tr

Hallo, ich will mit Java FX ein Programm schreiben welches immer die aktuelle Zeit angibt. (Habe das bisschen abgeändert dass die Zeit in Worten oder Binärcode ausgegeben wird, ist aber in einer Methode)
Jetzt will ich es schaffen dass mein Label "time" beim Programmstart jede Minute aktualisiert wird. (kenne das nur durch ein ActionEvent z.b Button)
Kann mir da jemand helfen?
Bis jetzt ist das so:

Main:
Java:
package interface_gui;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Control;
import javafx.scene.image.Image;
import javafx.stage.Stage;

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
primaryStage.setTitle("Words of Time");
primaryStage.getIcons().add(new Image(Main.class.getResourceAsStream("uhr.png")));
primaryStage.setScene(new Scene(root));
primaryStage.show();
}


public static void main(String[] args) throws InterruptedException {
launch(args);
}
}
Controller:
Java:
package interface_gui;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.control.Label;

public class Controller {
public static Label time;


}
Zeit-methode:
Java:
package interface_gui;

import java.text.SimpleDateFormat;
import java.util.Date;

public class timeinwords extends Controller {
public static int intHour;
public static int intMinute;
public static int intSecond;
public static int inputTime;

public static void getTime() throws InterruptedException {
String newTime = Hour() + Minute();
}

public static String Hour() {
SimpleDateFormat sdfHour = new SimpleDateFormat("HH");
String timeHour = sdfHour.format(new Date());
intHour = Integer.parseInt(timeHour);
//System.out.print(Integer.toBinaryString(intHour) + " ");
inputTime = intHour;
if (intHour % 10 == 0) {
return (zehner() + " Uhr ");
} else {
return (under20() + " Uhr ");
}
}

public static String Minute() {
SimpleDateFormat sdfMinutes = new SimpleDateFormat("mm");
String timeMinutes = sdfMinutes.format(new Date());
intMinute = Integer.parseInt(timeMinutes);
inputTime = intMinute;
if (intMinute % 10 == 0) {
return (zehner());
} else {
return (under20());
}
//System.out.print(Integer.toBinaryString(intMinute) + " ");
//System.out.println(intMinute);
}
fxml:

Code:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>


<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" style="-fx-background-color: #28abfa;" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="interface_gui.Controller">
<children>
<Label fx:id="time" layoutX="241.0" layoutY="180.0" text="test" textFill="WHITE">
<font>
<Font name="Arial Bold" size="35.0" />
</font>
</Label>
</children>
</AnchorPane>
Hallo Julius,

an sich kannst du das über einen TimerTask machen, der jede 60 Sekunden die Aktion ausführt, hier https://stackoverflow.com/questions/9966136/javafx-periodic-background-task

Das habe ich jetzt rauskopiert
Code:
Timeline timeline =
        new Timeline(new KeyFrame(Duration.millis(500), e -> rect.setVisible(!rect.isVisible())));
    timeline.setCycleCount(Animation.INDEFINITE); // loop forever
    timeline.play();
Und damit das Label geupdatet wird, sollte das Ganze noch im UIThread passieren, das geht über Platform#runlater
 
J

julius0205

Hallo Julius,

an sich kannst du das über einen TimerTask machen, der jede 60 Sekunden die Aktion ausführt, hier https://stackoverflow.com/questions/9966136/javafx-periodic-background-task

Das habe ich jetzt rauskopiert
Code:
Timeline timeline =
        new Timeline(new KeyFrame(Duration.millis(500), e -> rect.setVisible(!rect.isVisible())));
    timeline.setCycleCount(Animation.INDEFINITE); // loop forever
    timeline.play();
Und damit das Label geupdatet wird, sollte das Ganze noch im UIThread passieren, das geht über Platform#runlater
okay danke dir aber in welche Klasse kommt das jetzt rein? Also ich hab das jetzt in meine Controller Klasse rein mit ner Methode "labelUpdater();" aber irgendwie muss ich ja das ganze dann noch aktuallisieren bzw. mit der Uhrzeit aus der "TimeInWords" Klasse abgleichen.

und dein "rect" ist ja wohl mein "label aka. time" oder? sorry haha kenne mich nicht wirklich mit JavaFX aus aber wollte mich da mal reinfuchsen.
hab das jetzt so:
Java:
public class Controller {
    public static Label time;

    public static void labelUpdater(){

        time.setText(timeinwords.Hour() + timeinwords.Minute());
        Timeline timeline = new Timeline(new KeyFrame(Duration.millis(500), e -> time.setVisible(!time.isVisible())));
        timeline.setCycleCount(Animation.INDEFINITE);
        timeline.play();
    }
}
 
Zuletzt bearbeitet:
L

lam_tr

Ich hätte es so gemacht

Code:
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.control.Label;

public class Controller {

@FXML
Label time;

public void initialize(){
Timeline timeline =
        new Timeline(new KeyFrame(Duration.seconds(60), e -> Platform.runLater(()-> time.setText(***Hier kommt das gewünschte Text rein***))));
    timeline.setCycleCount(Animation.INDEFINITE); // loop forever
    timeline.play();
}

}
 
J

julius0205

Ich hätte es so gemacht

Code:
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.scene.control.Label;

public class Controller {

@FXML
Label time;

public void initialize(){
Timeline timeline =
        new Timeline(new KeyFrame(Duration.seconds(60), e -> Platform.runLater(()-> time.setText(***Hier kommt das gewünschte Text rein***))));
    timeline.setCycleCount(Animation.INDEFINITE); // loop forever
    timeline.play();
}

}
und was ist dieses UIThread damit es geupdated wird? Hab das jetzt mal ausgeführt und es wurde noch nichts aktualisiert. und jetzt kam noch eine Fehlermeldung nach warscheinlich 60 Sekunden:

1600162229704.png
 
L

lam_tr

Da ich nicht genau weiß an welcher Stelle der initialize Methode die NPE geschmissen wird, vermute ich mal dass der Label nicht initializiert wurde.

Lade die fxml mal über den
FxmlLoader loader = new FxmlLoader(getClass().getResource(url));
loader.load();
 
J

julius0205

Da ich nicht genau weiß an welcher Stelle der initialize Methode die NPE geschmissen wird, vermute ich mal dass der Label nicht initializiert wurde.

Lade die fxml mal über den
FxmlLoader loader = new FxmlLoader(getClass().getResource(url));
loader.load();
okay wow jetzt check ich langsam gar nichts mehr ^^ kannst du mir vllt sagen was in die ganze Controller Klasse kommt?
 
L

lam_tr

In die Controller Klasse kommen die Ganzen Controls Initializierung und Implementierung der Event Methoden. Zum Beispiel wenn du ein Button buttonPlay hast dann würde der Controller Klasse foldenges beinhalten.

Code:
class Controller{

// Control Initialisierung
@FXML Button buttonPlay;

// Methoden Implementierung für den Button onClick, es gibt an der Stelle noch mehr, je nachdem was du in der FXML Datei definierst. Der Methodenname muss im FXML Datei definiert werden.
@FXML
public void onButtonPlayMouseClicked(MouseEvent e){
}

}
Was ich vor allem noch sehr gerne in den Controller packe ist Databinding. Das kommt dann direkt in die initialize Methode.
 
J

julius0205

In die Controller Klasse kommen die Ganzen Controls Initializierung und Implementierung der Event Methoden. Zum Beispiel wenn du ein Button buttonPlay hast dann würde der Controller Klasse foldenges beinhalten.

Code:
class Controller{

// Control Initialisierung
@FXML Button buttonPlay;

// Methoden Implementierung für den Button onClick, es gibt an der Stelle noch mehr, je nachdem was du in der FXML Datei definierst. Der Methodenname muss im FXML Datei definiert werden.
@FXML
public void onButtonPlayMouseClicked(MouseEvent e){
}

}
Was ich vor allem noch sehr gerne in den Controller packe ist Databinding. Das kommt dann direkt in die initialize Methode.
ja das ist mir klar aber ich meine speziell für mein Fall jetzt. Ich habe ja kein ButtonEvent oder so. Ich weiß halt nicht wo ich die public void initialize und so reinschreiben soll damit alles funktioniert.
 
L

lam_tr

Die initialize Methode wird beim laden der Fxml Datei aufgerufen. Das heißt im Controller muss sie schon sein.

Mach doch ein Break Point in die Initialize Methode. Anscheinend wurde sie aufgerufen, wir wissen nur an der Stelle nicht was Null ist. Meine Vermutung liegt auf labelTime.
 
J

julius0205

Die initialize Methode wird beim laden der Fxml Datei aufgerufen. Das heißt im Controller muss sie schon sein.

Mach doch ein Break Point in die Initialize Methode. Anscheinend wurde sie aufgerufen, wir wissen nur an der Stelle nicht was Null ist. Meine Vermutung liegt auf labelTime.
time = null: bedeutet ja dass mein code zum ersetzen von time nicht funktioniert oder? also muss ich irgend einen weg finden dass ich mit meiner "TimeInWords" Klasse das label ersetze.
1600166587452.png
 
L

lam_tr

Mach mal das static bei dem Feld time weg und mach die Annotation @FXML dazu. Führe die Anwendung noch mal aus.
 
mrBrown

mrBrown

Ich würde dir empfehlen, dich noch mal näher mit den Grundlagen zu beschäftigen, bevor du mit GUIs arbeitest.

Die übermäßige Verwendung von static und auch das extends sind starke Zeichen für fehlende Grundlagen...
 
J

julius0205

Ich würde dir empfehlen, dich noch mal näher mit den Grundlagen zu beschäftigen, bevor du mit GUIs arbeitest.

Die übermäßige Verwendung von static und auch das extends sind starke Zeichen für fehlende Grundlagen...
Das mach ich nebenbei. Ist nur ein kleines Projekt ob ich das mit meinen Kenntnissen schaffe.
 
mrBrown

mrBrown

Ist nur ein kleines Projekt ob ich das mit meinen Kenntnissen schaffe.
Naja, dir fehlen halt die nötigen Grundlagen, von daher: Nein, mit deinen bisherigen Kenntnissen schaffst du das nicht.

Das ist auch überhaupt nicht böse gemeint – es ist nur nich sinnvoll, den dritten Schritt vorm ersten zu versuchen, dabei kommt nie was sinnvolles bei raus.
 
J

julius0205

Naja, dir fehlen halt die nötigen Grundlagen, von daher: Nein, mit deinen bisherigen Kenntnissen schaffst du das nicht.

Das ist auch überhaupt nicht böse gemeint – es ist nur nich sinnvoll, den dritten Schritt vorm ersten zu versuchen, dabei kommt nie was sinnvolles bei raus.
naja jetzt läuft es ja und habs mit meinen Kenntnissen alles geschafft außer das Labelupdate aber ich weiß schon was du meinst.
 
Thema: 

JavaFX Label aktualisieren

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben