0

我正在尝试编写一个简单的 JavaFx 程序,它假设检查时间并且每隔一整小时做一些事情(起初只更改标签中的文本)。但是我经常检查时间有问题。我正在使用日历类。如果我写了一个 while(true) 循环,程序会启动但什么也不做。我应该使用线程吗?我知道这可能是微不足道的问题,但我无法弄清楚,我对此有点陌生;p

谢谢大家的帮助(我不知道我应该在下面回复还是编辑这篇文章)。我设法创建了我自己的版本,我基于链接,你给了我。

public class Trening extends Application {
@Override
public void start(Stage primaryStage) {
    Task<Integer> task = new Task<Integer>() {
        @Override
        protected Integer call() throws Exception {
            Calendar tajm = Calendar.getInstance();
            int hour = tajm.get(Calendar.HOUR_OF_DAY);
            int minutes = 0;
            updateMessage(Integer.toString(hour));
            while (true) {
                try {
                    minutes = 60 - tajm.get(Calendar.MINUTE);
                    Thread.sleep(minutes * 60000);
                    if (tajm.get(Calendar.HOUR_OF_DAY) != hour) {
                        hour = tajm.get(Calendar.HOUR_OF_DAY);
                        updateMessage(Integer.toString(hour));

                    } else {

                    }
                } catch (InterruptedException ie) {
                    //System.err.print("...");
                }
            }
        }
    };

    Label btn = new Label();
    btn.textProperty().bind(task.messageProperty());
    new Thread(task).start();

    StackPane root = new StackPane();
    root.getChildren().add(btn);

    Scene scene = new Scene(root, 300, 250);

    primaryStage.setTitle("...");
    primaryStage.setScene(scene);
    primaryStage.show();
}

/**
 * The main() method is ignored in correctly deployed JavaFX application.
 * main() serves only as fallback in case the application can not be
 * launched through deployment artifacts, e.g., in IDEs with limited FX
 * support. NetBeans ignores main().
 *
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}}

就像我说的那样,我对编程很陌生,所以我很欣赏每一条建议。非常感谢您的帮助,如果您对我所写的内容有任何建议,我不会介意;p

抱歉,我没有将您的答案标记为有用,但我的声誉太低了......

4

2 回答 2

3

这是一种方法。

首先,封装您的周期性任务。

public static class MyPeriodicTask implements Runnable {

    public void run() {
        boolean fullHour = ... // determine somehow
        if (fullHour) {
            Platform.runLater(new Runnable() {

                public void run() {
                    // Modify label here
                }
            });
        }
    }
}

请注意Platform.runLater()调用,传递的这个保证Runnable将由 JavaFX 应用程序线程执行,您可以在其中安全地与 GUI 交互。

然后使用 anExecutorService定期运行您的任务

ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
executorService.scheduleAtFixedRate(new MyPeriodicTask(), 1, 1, TimeUnit.MINUTES);

这将每分钟运行一次任务(初始延迟 1 分钟后)。

但是,如果您对 JavaFX 很认真,那么我认为您至少应该阅读JavaFX 中的并发。

于 2013-08-27T16:46:54.060 回答
0

这应该可以帮助您入门,请注意我使用了服务。一个任务可能会更好。自从我编写 Java 以来已经有一段时间了,但是通过遵循本指南,我能够快速创建下面的示例。

它还使用日历库,希望对您有用。

import javafx.application.*;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.concurrent.WorkerStateEvent;
import javafx.event.EventHandler;


import java.util.Calendar;
import java.util.Date;



public class StackOverflow_001 <T extends Comparable<T>> extends Application {


    public static void main(String[] args) {
        launch(args); // Launches the application
    }

            // A simple service with an internal clock.
    private static class HourService extends Service<Date>
    {

        private Calendar calendar;

        public final void setCalendarInstance(Calendar c)
        {
            calendar = c;
        }


        @Override
        protected Task<Date> createTask() {

            return new Task<Date>() {

                protected Date call()
                {
                    int secondsdelay = 5;
                    Date timeStarted = calendar.getTime();
                    Date timeEnd = new Date(timeStarted.getTime() + 1000 * secondsdelay );//* 60 * 60);

                    while( timeEnd.after(calendar.getTime()) )
                    {
                        try {
                            System.out.println("---");
                            System.out.println("Time: " + calendar.getTime());
                            System.out.println("End:  " +timeEnd);

                            Thread.sleep(500);
                            calendar = Calendar.getInstance();
                        } catch (InterruptedException e) {

                            if (isCancelled()) {
                                updateMessage("Cancelled");
                                break;
                            }
                        }
                    }
                    System.out.println("Service ended.");
                    return timeEnd;

                }
            };
        }


    }

            // Sets up everything and creates the window.
    @Override
    public void start(Stage primaryStage) throws Exception {

        final VBox root = new VBox();
        primaryStage.setScene(new Scene(root, 800, 600));

        final Button btn1 = new Button();
        btn1.setText(Calendar.getInstance().getTime().toString());

        root.getChildren().add(btn1);

        final HourService hservice = new HourService();
        hservice.setCalendarInstance(Calendar.getInstance());
        hservice.setOnSucceeded(new EventHandler<WorkerStateEvent>() { // Anonymous

            @Override
            public void handle(WorkerStateEvent t) {
                btn1.setText(Calendar.getInstance().getTime().toString());
                hservice.restart();
            }
        });

        hservice.start();

        primaryStage.show();

    }


}
于 2013-08-27T18:04:39.143 回答