JavaFX自动打开新窗口

时间:2017-03-31 23:00:35

标签: java multithreading javafx javafx-8

我有A.fxml和B.fxml。使用Java Application覆盖start方法。我希望每40分钟循环(5次){打开新阶段B.fxml并等待stage.close,如果阶段关闭继续循环打开新阶段B fxml。循环这五次。我尝试计时器timertask我不能。我尝试JavaFX服务我不能。我创建了Mythread扩展Thread对象。这次我无法控制下一阶段的循环。当声明开始开放5阶段。但我想循环等待currentstage关闭然后进入下一个循环。这是我的失败代码;

public class Driver extends Application {

public static Stage stage;

@Override
public void start(Stage primaryStage) throws Exception {
    FXMLLoader loader = new FXMLLoader(getClass().getResource(View.SETTINGS));
    Parent root = loader.load();
    Scene scene = new Scene(root);
    stage = primaryStage;
    stage.setScene(scene);
    stage.setTitle("Info Library");
    stage.setResizable(false);
    stage.show();
    RandomQuestionThread thread = new RandomQuestionThread();
    if (DBContext.settings.isAbbreviation() || DBContext.settings.isTranslation()) {
        thread.start();
    }
}

public static void main(String[] args) throws InterruptedException {
    DBContext.settings = DBContext.getInstance().settings().getSettings();

    launch(args);
    HibernateUtil.getSessionFactory().close();
}

}

public class RandomQuestionThread extends Thread {
Thread randomThread = new Thread(this);
private String fxml;
private static String TITLE;


@Override
public void run() {
    while (true) {
        try {
            Thread.sleep(DBContext.settings.getAutoQuestionTime() * 6000);
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        for (int i = 0; i<DBContext.settings.getAutoQuestionCount(); i++) {
            randomFxml();
            Platform.runLater(()->{
                Parent root = null;
                try {
                    root = new FXMLLoader(getClass().getResource(fxml)).load();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Stage stage = new Stage();
                stage.setScene(new Scene(root));
                stage.setTitle(TITLE);
                stage.show();
                System.out.println(currentThread().getName());
            });
        }
    }
}

private void randomFxml() {
    int start = 0;
    if (DBContext.settings.isTranslation() && DBContext.settings.isAbbreviation()) {
        start = new Random().nextInt(2);
    } else if (DBContext.settings.isTranslation()) {
        start = 1;
    }

    switch (start) {
    case 0:
        fxml = View.ABBREVIATION;
        break;
    case 1:
        fxml = View.TRANSLATION;
        break;

    default:
        break;
    }
    if (start == 0) {
        TITLE = "KISALTMA SORUSU";
    } else TITLE = "ÇEVİRİ SORUSU";
}

}

我需要更多Java多线程。但修复此问题后。请解释我在哪里做错了。在循环中写入控制台currentThread名称控制台结果“Java Apllication Thread”。但我设置我的线程名称“MyThread”。我很困惑。我的大脑出现蓝屏错误。

3 个答案:

答案 0 :(得分:0)

您已将System.out.println(currentThread().getName())语句放入Platform.runLater(),这意味着它将在 JavaFX应用程序线程上执行(请参阅JavaDoc)。

关于将某些任务安排为使用预定义费率重复固定次数的问题,this post可以为您提供帮助。

答案 1 :(得分:0)

  

在循环中写入控制台currentThread名称控制台结果&#34; Java Apllication Thread&#34;。但我设置我的线程名称&#34; MyThread&#34;。我很困惑。

使用 { test: /\.(scss|css)$/, use: extractSass.extract({ use: [{ loader: "css-loader" }, { loader: 'postcss-loader', options: { plugins: function () { return [ require('precss'), require('autoprefixer'), require('cssnano'), require('postcss-modules') ]; } } }, { loader: "sass-loader" }], fallback: "style-loader" }) }, 安排在javafx应用程序线程上执行Platform.runLater而不是允许您修改UI的当前线程,但也导致当前线程是javafx应用程序线程而不是你从...中调用Runnable的主题

如果你想继续&#34;循环&#34; 窗口关闭后,您应安排在最后一个窗口关闭后打开下一个窗口。 Platform.runLater是等待舞台关闭的便捷方式。

对于时间安排,我建议使用Stage.showAndWait()

ScheduledExecutorService

答案 2 :(得分:0)

我解决了这个问题。我在主控制器init方法中使用了Timer和TimeTask。它的工作。但app start方法或mian方法阶段的相同代码并没有等待。我使用了stageshowandwait()方法,但线程没有等待。但是在主控制器init方法中唤醒了相同的代码。为什么我不知道。

Timer timer = new Timer();
    TimerTask timerTask = new TimerTask() {

        @Override
        public void run() {
            Platform.runLater(()->{
                for (int i = 0; i<4; i++) {
                    Parent root = null;
                    try {
                        root = new FXMLLoader(getClass().getResource(View.ABBREVIATION)).load();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    Stage stage = new Stage();
                    stage.setScene(new Scene(root));
                    stage.setTitle("deneme");
                    stage.showAndWait();
                }
            });
        }
    };

    timer.schedule(timerTask, 6000);