RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1402305
Accepted
Alerto
Alerto
Asked:2022-06-21 04:11:22 +0000 UTC2022-06-21 04:11:22 +0000 UTC 2022-06-21 04:11:22 +0000 UTC

在 Javafx 线程中打开新场景

  • 772

有一个代码可以启动其他代码并在进度条中显示这些代码的执行级别。它发生在void initialize(){...}

 void initialize() throws IOException {
     new Thread(() -> {
         try {
             map_8_8.SetZero();
         } catch (IOException e) {
             e.printStackTrace();
         }
         Platform.runLater(() -> bar.setProgress( bar.getProgress() + 0.33 ));
         try {
             map_8_8.Bomb();
         } catch (IOException e) {
             e.printStackTrace();
         }
         Platform.runLater(() -> bar.setProgress( bar.getProgress() + 0.33 ));
         try {
             map_8_8.GetBoxValue();
         } catch (IOException e) {
             e.printStackTrace();
         }
         Platform.runLater(() -> bar.setProgress(1));
     }).start();

填充进度条后,应该加载另一个场景,您可以替换它,例如在最后一段中:

    @FXML
    void initialize() throws IOException {
        new Thread(() -> {
            try {
                map_8_8.SetZero();
            } catch (IOException e) {
                e.printStackTrace();
            }
            Platform.runLater(() -> bar.setProgress( bar.getProgress() + 0.33 ));
            try {
                map_8_8.Bomb();
            } catch (IOException e) {
                e.printStackTrace();
            }
            Platform.runLater(() -> bar.setProgress( bar.getProgress() + 0.33 ));
            try {
                map_8_8.GetBoxValue(); // запуск кода после выполнения последнего которого я запускаю другую сцену
                try {
                    Parent root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("8X8.fxml")));
                    Stage window = (Stage) bar.getScene().getWindow();
                    window.setScene(new Scene(root, 600, 400));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            Platform.runLater(() -> bar.setProgress(1));
        }).start();
      
    }

但抛出错误:

java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-3
    at javafx.graphics/com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:292)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:446)
    at javafx.graphics/javafx.stage.Stage.setScene(Stage.java:265)
    at com.example.javasapp/com.example.javasapp.load_8_8.lambda$initialize$3(load_8_8.java:48)
    at java.base/java.lang.Thread.run(Thread.java:831)

我怎样才能解决这个问题或在没有这个错误的情况下达到预期的结果?

java javafx
  • 1 1 个回答
  • 47 Views

1 个回答

  • Voted
  1. Best Answer
    Perfect Voyage
    2022-06-24T02:41:59Z2022-06-24T02:41:59Z

    完整版在这里https://github.com/Platence/TaskProgressBar/tree/main/src/sample 一个使用Task类的例子

     public class ProcessingBar extends Task<Void> {
    
        private ProgressBar progressBar;
        private static final double MAX_VALUE = 1.0D;
    
        public ProcessingBar(ProgressBar progressBar) {
            this.progressBar = progressBar;
        }
    
        @Override
        protected Void call() throws Exception {
    
            // Есть ещё вариант с методом bind
            // Например
            // progressBar.progressProperty().bind(this.progressProperty());
    
            double startValue = 0D;
            System.out.println("start");
            while (startValue<MAX_VALUE){
                Thread.sleep(1000);
                setValue(startValue+=0.1D);
                System.out.println("Change Bar");
            }
            return null;
        }
    
        private void setValue(double value){
            Platform.runLater(()->{this.progressBar.setProgress(value);});
        }
    
    
    
    
    }
    

    来自控制器的代码

        public class Controller {
    
        @FXML
        private AnchorPane mainPane;
    
        public void initialize() {
            ProgressBar pb = new ProgressBar();
            pb.setLayoutY(10);
            pb.setLayoutX(10);
    
            ProgressBar pb2 = new ProgressBar();
            pb2.setLayoutY(30);
            pb2.setLayoutX(30);
    
    
            Platform.runLater(() ->
                    {
                        mainPane.getChildren().add(pb);
                        mainPane.getChildren().add(pb2);
                    }
            );
    
            Thread t1 = new Thread(new ProcessingBar(pb));
            Thread t2 = new Thread(new ProcessingBar(pb2));
            t1.setDaemon(true);t2.setDaemon(true);
            t1.start();
            t2.start();
    
        }
    }
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5