因此,我从数据库加载了一些数据,并使用了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()方法,其中将对doInbackground中创建的ArrayList的引用设置为来自mainGUI的arraylist,并且允许和禁止某些按钮。

这就是我从Gui调用SwingWorker的方式:

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));
        }
    }   

即使在SwingWorker done()中调试了最后一行代码,这也能很好地工作,我可以清楚地看到ArrayList ucty包含了来自databse的数据。

回到main gui之后,ArrayList naciatneUcty仍然为null。 但这不应该是因为我将其发送到SwingWorker,在那里应该更新其引用...

问题出在哪里,为什么参考文献根本没有更新?

===============>>#1 票数:0

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

  ask by user3511458 translate from so

未解决问题?本站智能推荐:

1回复

使用SwingWorker更新Java Gui

下面是一个SwingWorker实例,它没有像我期望的那样更新Java GUI。 SwingWorker在按钮的动作侦听器内部实现。 定义循环的min和max都是“ final int”,它们对于动作侦听器而言是本地的。 SwingWorker应该在每次迭代时调用NQueens对象
1回复

java swingworker不更新GUI

基本上,问题是我的SwingWorker没有按照我的意愿去做,在这里我将使用一些简化的代码示例,这些示例与我的代码相似,但是没有讨厌的无关紧要的细节。 我有两节课: MainPanel扩展JPanel GalleryPanel扩展JPanel 这个想法是MainP
2回复

使用SwingWorker更新GUI

我昨天在这里发布了一个有关在使用Scheduledexecutorservice时防止UI冻结的问题,为了防止UI冻结(scheduledexecutorservice) , 我应该怎么做 ,大多数人建议使用SwingWorker而不是Scheduledexecutorservice。 但是,
1回复

使用SwingWorker更新gui

我正在尝试使用类生成SwingWorker送给SwingWorker的值更新progressBar 。 在GUI中,我有此方法: 而且我也在这样做: 在SwingWorker我有一个方法"setProgress"来更新对象的变量值,然后计算对象,然后我希望SwinWorke
2回复

Java Swingworker接连更新GUI

我正在使用一些多线程应用程序进行Java swing。 情况是这样的,我需要一个接一个地执行一个线程,即我的一个输出与第二个线程相关。 我做了以下。 // GUI类 我的问题是: 1)如何以完美的顺序运行所有工人。 即,当worker1完成后,再启动worker 2,
2回复

java swingworker线程更新主桂

我想知道从swingworkerthread向jtextarea添加文本的最佳方法是什么,我创建了另一个类,jbutton通过Threadsclass()调用.exese(); 并且该代码与该线程并行运行 现在我喜欢做的是将x的值添加到主gui的文本区域,任何想法都非常感激。
2回复

从SwingWorker实时更新GUI

好的,这是我昨天的问题“ SwingWorker中的错误处理 ”的后续问题。 考虑到这样的事实,它可能是好的调用SwingUtilities#invokeAndWait()内SwingWorker#doInBackground()我想更进一步推,然后问: 也许它也确定调用SwingUtil
1回复

即使使用SwingWorker,Java GUI也会冻结

我正在尝试使用SwingWorker执行冗长的任务并使用结果更新JLabel: 我可以随意点击按钮多次,Gui将保持响应,直到两个线程完成,此时Gui在线程运行时冻结。 如果我一次只运行一个线程,则仍会出现此问题。 如果有人能指出我是否错误地使用了SwingWorker,或者是否
2回复

Java SwingWorker锁定GUI

我有以下代码... 这是一个弹出菜单操作,应创建一个新的SwingWorker,释放GUI,进行一些工作,然后更新窗口的结果。 但是,现在,当我单击菜单项时,GUI会被锁定,直到工作完成为止,这令人感到莫名其妙,因此使用SwingWorker的全部目的就不会发生。 关于我在做什么
1回复

SwingWorker进程()更新gui Generics

我试图使用SwingWorker来更新我的gui。 我想要更新的gui部分是带有GridLayout [50] [50]的JPanel(gridPanel)。 GridLayout中的每个网格都有一个自定义GridGraphic JComponent。 在SwingWorker的