Отображение текста / фигуры в указанное время в JavaFX - PullRequest
0 голосов
/ 22 мая 2018

У меня проблема с javaFX.Я хочу отображать время в окне приложения каждые 1000 мс.

public class Main extends Application {

StackPane root = new StackPane();
Time time;
Text t1;
@Override
public void start(Stage primaryStage) throws Exception{
    root.setStyle("-fx-background-color: #00FF00");
    primaryStage.setTitle("My App");
    primaryStage.setScene(new Scene(root, 1000, 800));
    primaryStage.show();
    checkTime();


    primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
        @Override
        public void handle(WindowEvent t) {
            Platform.exit();
            System.exit(0);
        }
    });
}


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

public void checkTime(){
    time = new Time();
    time.start();
}

public void displayTime(int hour, int minute, int second){
    t1= new Text(200, 50, hour + ":" + minute + ":" + second);
    root.getChildren().add(t1);
}


}

И это второй класс:

package sample;


import java.util.Calendar;

public class Time extends Thread {

Thread t;
public int hour;
public int minute;
public int second;
Calendar calendar;
Main main = new Main();


Time() {
}

public void run() {
    for (; ; ) {
        try {
            getTime();
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
    }
}

public void start() {
    t = new Thread(this);
    t.start();

}

public void getTime() {
    calendar = Calendar.getInstance();
    hour = calendar.get(Calendar.HOUR);
    minute = calendar.get(Calendar.MINUTE);
    second = calendar.get(Calendar.SECOND);
    System.out.println(hour + ":" + minute + ":" + second);
    main.displayTime(hour, minute, second);

}


}

Я бы хотел, чтобы он работал аналогично цифровым часам.На следующих этапах проекта я хочу использовать этот способ аналогично другим 2D-фигурам.

В этот момент после включения приложения время, проведенное в консоли, является правильным.Тем не менее, я бы хотел, чтобы точно такое же время отображалось в окне приложения, в данный момент отображается только фон и больше ничего.

1 Ответ

0 голосов
/ 22 мая 2018
  1. В большинстве случаев вам не нужно расширяться напрямую от Thread, потому что в JavaFX есть такие вещи, как Timeline, которые могут действовать как таймеры.Наличие этого класса Time прекрасно, если вы считаете, что это необходимо (по другим причинам, которые вы не указали).
  2. Расширение с Thread и создание другого Thread определенно не требуется.Когда класс Time расширяет Thread, он уже является Thread.
  3. Вы создаете новый экземпляр Main в Time.Main должен создать Time и передать сам по себе Time, иначе Time не будет содержать ссылку на исходный Main объект.
  4. Я думаю, вы определенно получите какое-то исключениево время выполнения, даже когда вы решаете # 3.Вы непосредственно модифицируете граф сцены через Поток Приложений, отличных от JavaFX (т. Е. Ваш поток класса Time).Кроме того, вы создаете новый Text объект каждый цикл Time, поэтому даже если исключений нет, эти Text объекты будут перекрывать друг друга.

Если вы хотитесохраняйте класс Time по другим специальным причинам, тогда обычно это то, что вы должны делать:

public class Main extends Application {
    StackPane root = new StackPane();
    Time time;
    Text t1 = new Text(); // Instantiates only once

    @Override
    public void start(Stage primaryStage) throws Exception{
        root.setStyle("-fx-background-color: #00FF00");
        primaryStage.setTitle("My App");
        primaryStage.setScene(new Scene(root, 1000, 800));
        primaryStage.show();

        root.getChildren().add(t1);

        checkTime();


        primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent t) {
                Platform.exit();
                System.exit(0);
            }
        });
    }


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

    public void checkTime(){
        time = new Time(this); // Pass ownself into Time
        time.start();
    }

    public void updateTime(int hour, int minute, int second){
        Platform.runLater(() -> t1.setText(200, 50, hour + ":" + minute + ":" + second));
    }
}
public class Time extends Thread {
    //Thread t; // Not needed
    public int hour;
    public int minute;
    public int second;
    Calendar calendar;
    Main main; // Don't instantiate

    // Pass in the main object
    Time(Main main) {
        this.main = main;
    }

    public void run() {
        for (; ; ) {
            try {
                getTime();
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
        }
    }

    // This is not needed, Time class has its own start() method, which will call its run() method.
    //public void start() {
    //    t = new Thread(this);
    //    t.start();
    //}

    public void getTime() {
        calendar = Calendar.getInstance();
        hour = calendar.get(Calendar.HOUR);
        minute = calendar.get(Calendar.MINUTE);
        second = calendar.get(Calendar.SECOND);
        System.out.println(hour + ":" + minute + ":" + second);
        main.updateTime(hour, minute, second); // Update main
    }
}
...