Reference Java SwingWorker未从GUI更新对对象的引用

Reference Java SwingWorker未从GUI更新对对象的引用,reference,swingworker,Reference,Swingworker,所以我从数据库中加载了一些数据,并使用SwingWorker进行处理 public class LoadFromDatabase extends SwingWorker<ArrayList<Ucet>, GuiUpdate>{ private ArrayList<Ucet> ucty; private JLabel lblStav; private File dbPath; private JProgressBar progr

所以我从数据库中加载了一些数据,并使用SwingWorker进行处理

public class LoadFromDatabase extends SwingWorker<ArrayList<Ucet>, GuiUpdate>{

    private ArrayList<Ucet> ucty;
    private JLabel lblStav;
    private File dbPath;
    private JProgressBar progress;
    private int pocetUctov;
    private JButton btnLoad;
    private JButton btnStart;

    public LoadFromDatabase(ArrayList<Ucet> ucty,JLabel lblStav,File dbpath,JProgressBar progress, JButton btnLoad,JButton btnStart){
        this.ucty=ucty;
        this.lblStav=lblStav;
        this.dbPath=dbpath;
        this.progress=progress;
        this.btnLoad=btnLoad;
        this.btnStart=btnStart;

    }

    @Override
    protected ArrayList<Ucet> doInBackground() throws Exception {
        String sqlLoadUcty="SELECT email,password FROM members";
        ArrayList<Ucet> ucty2=new ArrayList<>();
        try {
          Class.forName("org.sqlite.JDBC");
          Connection conn = DriverManager.getConnection("jdbc:sqlite:"+dbPath.getPath());
          Statement stmt = conn.createStatement();
          stmt.setQueryTimeout(30);
          ResultSet rs = stmt.executeQuery(sqlLoadUcty);
          GuiUpdate gd=new GuiUpdate(GuiUpdate.GuiType.setStartLoading);
          gd.setValue(0);
          publish(gd);
          pocetUctov=rs.getFetchSize();
          gd=new GuiUpdate(GuiUpdate.GuiType.setMaxValue); 
          gd.setValue(pocetUctov);
          publish(gd);
          int counter=0;
          while (rs.next()){
              Ucet uct=new Ucet(
                      rs.getString("email"),
                       rs.getString("password")
                      );
              gd=new GuiUpdate(GuiUpdate.GuiType.setValue);
              gd.setValue(counter);
              publish(gd);
              ucty2.add(uct);
          }

          rs.close();
          stmt.close();
          conn.close();

        } catch (ClassNotFoundException ex) {
            System.out.println("Problem= "+ex);

        } catch (SQLException ex) {
             System.out.println("Problem= "+ex);

        }


        return ucty2;
    }


    @Override
    public void process(List<GuiUpdate> update){
        for (GuiUpdate guiUpdate : update) {
            if (guiUpdate.getToDo()==GuiUpdate.GuiType.setStartLoading) {
                lblStav.setText("Loading ...");
                progress.setVisible(true);
            } else if (guiUpdate.getToDo()==GuiUpdate.GuiType.setMaxValue) {
                progress.setMaximum(guiUpdate.getValue());
                pocetUctov=guiUpdate.getValue();
                progress.setMinimum(0);
            } else if (guiUpdate.getToDo()==GuiUpdate.GuiType.setValue) {
                progress.setValue(guiUpdate.getValue());
            }
        }
    }

    @Override
    public void done(){
        progress.setVisible(false);

        btnLoad.setEnabled(true);
        try {
            ucty=get();
        } catch (InterruptedException ex) {
            System.out.println("Problem= "+ex);
        } catch (ExecutionException ex) {
           System.out.println("Problem= "+ex);
        }
        if (ucty!=null && ucty.size()>0) {
            btnStart.setEnabled(true);
            lblStav.setText("Loaded "+ucty.size()+" accounts.");
        }
    }


}
这非常有效,即使调试SwingWorker done()中的最后一行代码,我也可以清楚地看到ArrayList ucty contians从数据库中读取数据

返回主gui后,ArrayList naciatneUcty仍然为空。 但不应该是这样,因为我将它发送给SwingWorker,在那里它的引用应该更新…


问题出在哪里,为什么引用根本没有更新?

Java引用是按值传递的,因此当执行
ucty=get()
时,swingworker内部的引用会发生更改,但这不会更新naciatneUcty的引用。您最好在运行swingworker之前实例化naciatneUcty,让doInBackground()返回void,废弃utcy2,然后在done()方法中获取utcy。

“一旦bact到主gui…”也有问题。你不应该用这个来线性思考。done()返回到主gui。
private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        JFileChooser fileDb=new JFileChooser();
        int returnVal=fileDb.showOpenDialog(this);
        if (returnVal==JFileChooser.APPROVE_OPTION) {
            databasePath=fileDb.getSelectedFile();
            jButton4.setEnabled(false);
            execurtor.execute(new LoadFromDatabase(naciatneUcty, jLabel9, databasePath, jProgressBar1, jButton4,jButton1));
        }
    }