Java线程问题 - 更新GUI

时间:2010-08-06 18:32:26

标签: java swing

我正在尝试使用线程在后台运行lenghty操作并更新UI。 这就是我想要做的事情:

  1. 点击一下按钮,显示一个带有“插入数据库”
  2. 消息的popupjframe
  3. 创建一个新线程,将1000个条目插入数据库。
  4. 当插入条目时,我希望popupjframe消失并显示带有yes,no按钮的joptionpane
  5. 单击是按钮我想显示另一个框架,其中包含有关插入过程的报告/详细信息
  6. 这是我的代码:

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    //display popupframe first
    
    jFrame1.pack();
    jFrame1.setVisible(true);
    jFrame1.setLocationRelativeTo(getFrame());
    Thread queryThread = new Thread() {
    public void run() {
    runQueries();
    }};
    queryThread.start();
    }
    

    //runqueries method inserts into DB

    private void runQueries() {
    for (int i = 0; i <= 50000; i++) {
    insertintoDB();
    updateProgress(i);
    }
    }
    
    //update the popupjframe
    private void updateProgress(final int queryNo) {
    SwingUtilities.invokeLater(new Runnable() {
     public void run() {
    if (queryNo == 50000) { //means insertion is done
    jFrame1.setVisible(false);
    
    int n = JOptionPane.showConfirmDialog(getFrame(), menuBar, null, JOptionPane.YES_NO_OPTION);
    
    if (n == 1) { //NO option was selected
    return;}
    else
    //display another popupframe with details/report of inserting process
    }});
    }
    
    1. 我的方法是否正确?
    2. 如何以及何时停止/中断“queryThread”?
    3. 如果我在runqueries方法本身(在for循环之后)创建popupjframe并显示joptionpane ??
    4. 是否正确?

      提前致谢。

1 个答案:

答案 0 :(得分:4)

查看SwingWorker的文档。它完全符合您的要求。创建一个子类,并从doInBackground()调用runQueries,然后在done()中执行runnable所做的操作(减去if queryNo check)。如果您不使用java 1.6,则可以使用此类的第三方版本。

class DbSwingWorker extends SwingWorker<Void, Integer> {

    @Override
    protected Void doInBackground() throws Exception {
        for (int i = 0; i <= 50000; i++) {
            insertintoDB();
            publish(i); //if you want to do some sort of progress update
        }
        return null;
    }

    @Override
    protected void done() {
        int n = JOptionPane.showConfirmDialog(getFrame(), menuBar, null, JOptionPane.YES_NO_OPTION);

        if (n == 1) { //NO option was selected
            return;
        } else {
            //display another popupframe with details/report of inserting process

        }
    }
}

可在此处找到原始的非1.6版本:https://swingworker.dev.java.net/