结合使用Javafx进度栏和加载数据的方法

时间:2019-03-19 13:14:26

标签: multithreading javafx task progress-bar

我有一个使用Hibernate连接从db加载数据的方法。我想添加到此方法-进度栏-用于显示何时加载数据将结束。

这是我加载数据的方法:

    @FXML
    private JFXProgressBar progressBar;

    @FXML
    private JFXTextArea textArea;

    @FXML
        void executeQuery(MouseEvent event) {
            //LOAD DATA FROM DB USING HIBERNATE AND SET TEXT TO TEXTAREA
            EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("firebird_config_file");
            EntityManager entityManager = entityManagerFactory.createEntityManager();

            TypedQuery<Programy> query1 =  entityManager.createQuery("select p from Programy p", Programy.class);
            String resultOfTheQuery="";
            for (Programy programy  : query1.getResultList() ) {
                String tmp= "Nazwa programu: " + programy.getExeNazwa() + " Kod programu: " + programy.getKodProg()+" Wersja: "+programy.getWersja()+"\n";
                resultOfTheQuery+=tmp;
            }
            textArea.setText(resultOfTheQuery);
        }

这是我的场景的屏幕截图(我正在使用fxml文件): enter image description here

1 个答案:

答案 0 :(得分:2)

我认为这很难(即使不是不可能)实现。

如果您从传统意义上考虑SQL查询,则它不知道有多少个数据集以及将花费多长时间。我不知道有任何SQL工具(例如DB Visualizer,DataGrip等)会向您显示进度条以及对所需时间的正确估计,因为它始终取决于表中的数据量。

将需要一种测量数据何时加载25%/ 50%/ 75%/ ...的方法。唯一的事情是,可能需要花费很多时间在代码中 DatagramSocket()通话。

不同的解决方案

我建议删除进度条,并添加诸如微调器之类的东西,以表明正在进行数据加载。 JFoenix有一个不错的材质设计微调器。

您还可以添加一个简单的“正在加载数据...”文本。

编辑(以使其更加可见): 正如@Slaw正确建议的那样,您还需要将entityManager.createQuery(...)调用放入新线程中。否则,当查询需要更多时间时,UI线程可能会冻结。