Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Java - Přepsání kódu do JavaFX

Dobrý den,

Abych to upřesnil, našel jsem hotovou třídu na přidání ukazatele hodin - obr1

Trochu jsem ho upravil a přidal do projektu - Clock.java

Jenže jsem teď začal vytvářet projekt v JavaFX a chci to tam také přidat.

Avšak jsem na internetu nenašel žádnou podobnou variaci třídy Clock.java v JavaFX podobě.

Vím, že do JavaFX je možné přidávat i Swing, to však nechci.

Tak jsem to zkoušel přepsat. Změnit JLabel ze swing knihovny na Label s JavaFX knihovny a jeho celkové nastavení jsem zvládl.

Ovšem nevím, jakou JavaFX "variaci" použít pro ActionListener, Date a Timer.

Hodiny se totiž vůbec nezobrazí a vyhodí to chybu

Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = AWT-EventQueue-0...

Prosím o radu.

Předem děkuji.

PS. Takhle jsem zatím třídu Clock.java přepsal - ClockFX.java

TXT jsou pouze navíc, protože jdou otevřít přímo na webu.

Předmět Autor Datum
Tak už jsem na to došel. package settlers_javafx; import java.text.SimpleDateFormat; import java.ut… nový
MichalDM 06.09.2017 18:20
MichalDM
Je ti jasne, ze presnost techto hodin nebude buhvijaka? nový
MaSo 06.09.2017 18:29
MaSo
Fungují dobře a 100% přesnost na sekundy nepotřebuji. Ale stejně by mě zajímalo, co máš na mysli? nový
MichalDM 06.09.2017 22:04
MichalDM
package settlers; import java.text.SimpleDateFormat; import java.util.Date; import javafx.animation.… poslední
MichalDM 10.09.2017 14:30
MichalDM

Tak už jsem na to došel.

package settlers_javafx;

import java.text.SimpleDateFormat;
import java.util.Date;
import javafx.animation.Timeline;
import javafx.geometry.Pos;
import javafx.scene.text.Font;

public final class Clock extends javafx.scene.control.Label {

    private final SimpleDateFormat SIMPLE_DATE_FORMAT;

    public Clock(String type, int x, int y, int width, int height) {
        setTextFill(javafx.scene.paint.Color.BLUE);
        setLayoutX(x);
        setLayoutY(y);
        setPrefSize(width, height);
        switch (type) {
            case "date":
                SIMPLE_DATE_FORMAT = new SimpleDateFormat("  MMMM dd yyyy");
                setFont(new Font("sans-serif", 12));
                setAlignment(Pos.CENTER_LEFT);
                break;
            case "time":
                SIMPLE_DATE_FORMAT = new SimpleDateFormat("hh:mm:ss a");
                setFont(new Font("sans-serif", 40));
                setAlignment(Pos.CENTER);
                break;
            case "day":
                SIMPLE_DATE_FORMAT = new SimpleDateFormat("EEEE  ");
                setFont(new Font("sans-serif", 16));
                setAlignment(Pos.CENTER_RIGHT);
                break;
            default:
                SIMPLE_DATE_FORMAT = new SimpleDateFormat();
        }
        Timeline timer = new Timeline(new javafx.animation.KeyFrame(javafx.util.Duration.seconds(1), (javafx.event.ActionEvent event) -> {
            Date d = new Date();
            setText(SIMPLE_DATE_FORMAT.format(d));
        }));
        timer.setCycleCount(Timeline.INDEFINITE);
        timer.play();
    }
}
package settlers;

import java.text.SimpleDateFormat;
import java.util.Date;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.util.Duration;

public final class Clock extends javafx.scene.control.Label {

    private final SimpleDateFormat SIMPLE_DATE_FORMAT;
    private final double SCREEN_WIDTH = javafx.stage.Screen.getPrimary().getVisualBounds().getWidth();

    public Clock(String type, int right_edge, int y, int width, int height) {
        setTextFill(Color.BLUE);
        setLayoutX(SCREEN_WIDTH - right_edge);
        setLayoutY(y);
        setPrefSize(width, height);
        setFont(Font.font("Arial", 15));
        switch (type) {
            case "date":
                SIMPLE_DATE_FORMAT = new SimpleDateFormat("dd. MM. yyyy");
                break;
            case "time":
                SIMPLE_DATE_FORMAT = new SimpleDateFormat("hh:mm:ss a");
                setFont(Font.font(40));
                break;
            default:
                SIMPLE_DATE_FORMAT = new SimpleDateFormat("EEEE");
        }
        Timeline timer = new Timeline(new KeyFrame(Duration.millis(250), (ActionEvent event) -> {
            setText(SIMPLE_DATE_FORMAT.format(new Date()));
        }));
        timer.setCycleCount(Timeline.INDEFINITE);
        timer.play();
    }
}

Trochu jsem ten kód zjednodušil a timer nastavil na 250ms - Doufám, že jsi spokojený.

Zpět do poradny Odpovědět na původní otázku Nahoru