Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database javaFX:如何定期从数据库加载信息并将其显示在标签上?_Database_Timer_Javafx - Fatal编程技术网

Database javaFX:如何定期从数据库加载信息并将其显示在标签上?

Database javaFX:如何定期从数据库加载信息并将其显示在标签上?,database,timer,javafx,Database,Timer,Javafx,我想定期执行一个方法,该方法从数据库获取信息,并将其显示在标签中,我尝试了以下代码: Timer timer = new Timer(); timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { //update information miseAjour();

我想定期执行一个方法,该方法从数据库获取信息,并将其显示在标签中,我尝试了以下代码:

 Timer timer = new Timer();
            timer.scheduleAtFixedRate(new TimerTask() {
             @Override
             public void run() {
                 //update information
                 miseAjour();
             }
            }, 0, 2000);
当我运行主程序时,后台服务也正常运行,但当数据库上的信息发生变化时,我会出现以下异常:

Exception in thread "Timer-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = Timer-0
这是miseAjour方法的代码:

public void miseAjour(){
    try {

        dbConnection db = new dbConnection();
        Connection connect = db.connectiondb();
        connect.setAutoCommit(false);
        Statement stmt= connect.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT count(*) as nbrAderent  FROM  gss_aderent ");  
        int nbrAderent = rs.getInt("nbrAderent"); 
        rs.close();
        stmt.close();
        connect.commit();
        connect.close();
        main_nbrAdrTot.setText(nbrAderent + "");
    } catch (SQLException ex) {
        Logger.getLogger(SimpleController.class.getName()).log(Level.SEVERE, null, ex);
    }
   }

您可以为此设置计时器,但我建议使用JavaFX提供的API,称为

ScheduledService用于定期执行相同的任务,因为它在内部创建了一个API,所以有一些API可以帮助您将值绑定到UI控件

ScheduledService<Object> service = new ScheduledService<Object>() {
     protected Task<Object> createTask() {
         return new Task<Object>() {
             protected Object call() {
                 // Call the method and update the message
                 updateMessage(miseAjour());
                 return object; // Useful in case you want to return data, else null
             }
         };
     }
 };
 service.setPeriod(Duration.seconds(10)); //Runs every 10 seconds

 //bind the service message properties to your Label
 label.textProperty().bind(service.messageProperty()); // or use your label -> main_nbrAdrTot

最后我解决了这个问题,下面是代码:

public class TimerServiceApp {
    public void start() throws Exception {
        TimerService service = new TimerService();
        service.setPeriod(Duration.seconds(10));
        service.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
            @Override
            public void handle(WorkerStateEvent t) {
                main_nbrAdrTot.setText(t.getSource().getMessage());
            }
        });
        service.start();
    }



    private class TimerService extends ScheduledService<Integer> {
        private final StringProperty  nbrTotAderent = new SimpleStringProperty();


         public final void  setTotalAderentNumber(String value ) {
             nbrTotAderent.set(value);
         }


        public String getTotalAderentNumber() throws SQLException  {
        String nbrAderent = null;
        ResultSet rs=null;
        Statement stmt=null;
        Connection connect=null;

        try {
        dbConnection db = new dbConnection();
        connect = db.connectiondb();
        connect.setAutoCommit(false);
        stmt= connect.createStatement();
        rs = stmt.executeQuery("SELECT count(*) as nbrAderent  FROM  gss_aderent ");  
        nbrAderent = String.valueOf(rs.getInt("nbrAderent")); 
        connect.commit();
        } catch (SQLException ex) {
        Logger.getLogger(SimpleController.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally {
        rs.close();
        stmt.close();
        connect.close();
        }
        System.out.println(" Total aderent number updated to :" + nbrAderent + " Aderents ");
        return nbrAderent;
        }

        protected Task<Integer> createTask() {
            return new Task<Integer>() {
                protected Integer call() throws SQLException {

                    nbrTotAderent.setValue(getTotalAderentNumber());
                    updateMessage(getTotalAderentNumber());
                    return  Integer.parseInt(getTotalAderentNumber());
                }
            };
        }
    }
} `

我不知道该解决方案是否经过优化,但它是有效的:谢谢@ItachiUchiha我在下面的回答中采用了您的解决方案

这应该会对您有所帮助:谢谢@ItachiUchiha提供了快速而有条理的回答,但您能告诉我为什么在调用方法中使用未声明的变量,即变量对象,我在这个问题上遇到了错误。你可以使用return null而不是return object。我在代码上没有错误,但是标签在没有任何值的情况下仍然为空,方法miseAjour永远不会执行!你开始服务了吗?您可以查看。是的,它已启动,但标签上仍然没有任何内容,我尝试在控制台上打印值:service.messageProperty.getValue此ruturn no值:
public class TimerServiceApp {
    public void start() throws Exception {
        TimerService service = new TimerService();
        service.setPeriod(Duration.seconds(10));
        service.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
            @Override
            public void handle(WorkerStateEvent t) {
                main_nbrAdrTot.setText(t.getSource().getMessage());
            }
        });
        service.start();
    }



    private class TimerService extends ScheduledService<Integer> {
        private final StringProperty  nbrTotAderent = new SimpleStringProperty();


         public final void  setTotalAderentNumber(String value ) {
             nbrTotAderent.set(value);
         }


        public String getTotalAderentNumber() throws SQLException  {
        String nbrAderent = null;
        ResultSet rs=null;
        Statement stmt=null;
        Connection connect=null;

        try {
        dbConnection db = new dbConnection();
        connect = db.connectiondb();
        connect.setAutoCommit(false);
        stmt= connect.createStatement();
        rs = stmt.executeQuery("SELECT count(*) as nbrAderent  FROM  gss_aderent ");  
        nbrAderent = String.valueOf(rs.getInt("nbrAderent")); 
        connect.commit();
        } catch (SQLException ex) {
        Logger.getLogger(SimpleController.class.getName()).log(Level.SEVERE, null, ex);
        }
        finally {
        rs.close();
        stmt.close();
        connect.close();
        }
        System.out.println(" Total aderent number updated to :" + nbrAderent + " Aderents ");
        return nbrAderent;
        }

        protected Task<Integer> createTask() {
            return new Task<Integer>() {
                protected Integer call() throws SQLException {

                    nbrTotAderent.setValue(getTotalAderentNumber());
                    updateMessage(getTotalAderentNumber());
                    return  Integer.parseInt(getTotalAderentNumber());
                }
            };
        }
    }
} `
 TimerServiceApp s = new TimerServiceApp();
        s.start();