【问题标题】:Javafx: new UI threadJavafx:新的 UI 线程
【发布时间】:2017-02-06 18:09:01
【问题描述】:
...
public ProgressBar loadProgressBar;
...
Task task = new Task<Void>()
    {
        @Override
        public Void call()
        {
            Platform.runLater(()
                    -> 
                    {

                        Stage stage = new Stage();
                        Group root = new Group();
                        Scene scene = new Scene(root, 2000, 2000, Color.BLACK);
                        stage.setTitle("JavaFX Scene Graph Demo");
                        stage.setScene(scene);
                        stage.setMaximized(true);
                        //  stage.show();

                        Label tempLbl = new Label();
                        double h=0;
                        root.getChildren().add(tempLbl);
                        tempLbl.setText("");
                        for (int i = 0; i < 10000000; i++)
                        {
                            tempLbl.setText(tempLbl.getText()+"asd");
                            root.applyCss();
                            root.layout();
                            w=w+tempLbl.getHeight();
                            updateProgress(i, 10000000);
                        }
            });
            return null;
        }

    };

    loadProgressBar.progressProperty().bind(task.progressProperty());
    new Thread(task).start();

如果去掉 Platform.runLater tempLbl.getHeight() 总是等于 0。 如果您让 Platform.runLater loadProgressBar 在达到 100% 之前不更新。 如何避免?

【问题讨论】:

  • 你能至少解释一下你认为这段代码应该做什么吗?
  • 这是一个简化版。采用完整版文本,根据字体、高度和长度进行分页。每次页面结果都不同,具体取决于设置。代码只需要对其进行计数即可。但是没有制动第二个流,或者因为我没有这样做。
  • 我知道这可能只是一个示例,但代码完全没有意义。为什么要创建一个在后台线程上运行的东西,而它只是在 FX 应用程序线程上转身并执行整个事情?
  • 如果代码不在UI线程中运行,则高度tempLbl保持等于0。代码不起作用。
  • 当代码毫无意义时,我什至不知道“工作”是什么意思。

标签: java javafx progress-bar


【解决方案1】:

嗯: :

1) 推荐使用JavaFX Service

2) 当您尝试从外部线程修改 JavaFX 场景时,您必须使用 Platform.runLater(..)

3) 如果您想查看进度更改,请在循环中添加 Thread.sleep(50) 。没有睡眠,只有达到 100% 才能看到进度

4) 一些Task&lt;?&gt; 方法允许从外部线程调用,而一些不允许。他们被允许,如果你看到他们调用的内部代码Platform.isJavaFXThread(),如果没有,那么他们使用Platform.runLater();

【讨论】:

  • @Artyom 我也向你推荐这本书Metro 2033,因为你与基础演员有相同的名字?。
猜你喜欢
  • 2015-10-26
  • 2014-08-26
  • 2014-05-11
  • 2013-07-26
  • 2016-01-11
  • 2013-01-18
  • 2014-12-22
  • 2015-05-17
  • 2015-02-03
相关资源
最近更新 更多