如何显示过程调用的进度条

时间:2013-12-10 15:10:32

标签: java swing jdbc jtable jprogressbar

我将数据存储在Jtable中,然后我逐行获取此数据并将此数据传递给数据库中的可调用过程(每行调用1次),并且过程在完成后返回消息,此过程几乎占用每次通话1-2分钟,有人可以告诉我如何在整个过程中显示单个进度条。 (我的意思是所有呼叫都有1个进度条),我希望一旦循环结束就完成进度条。

我的代码如下:

DefaultTableModel model = (DefaultTableModel) data.getModel();
for (int count = 0; count < model.getRowCount(); count++) {
    CallableStatement csmt = con.prepareCall("{call CODE_REVIEW.PRC_WRAPPER_REVIEW(?,?,?,?)}");

    String folder=model.getValueAt(count, 0).toString();
    String type=model.getValueAt(count, 1).toString();
    String name=model.getValueAt(count, 2).toString();

    csmt.setString(1,name);
    csmt.setString(2,type);
    csmt.setString(3,folder);
    csmt.registerOutParameter(4,java.sql.Types.VARCHAR);
    csmt.execute();
    String messege =csmt.getString(4);
}

2 个答案:

答案 0 :(得分:3)

您可以使用SwingWorker在后​​台拨打电话,并在Event Dispatching Thread(a.k.a。EDT)中更新进度条。像这样:

SwingWorker<Void, Integer> worker = new SwingWorker<Void, Integer>() {
    @Override
    protected Void doInBackground() throws Exception {
        int processed = 0;
        DefaultTableModel model = (DefaultTableModel) data.getModel();
        for (int count = 0; count < model.getRowCount(); count++) {
            //...
            String messege = csmt.getString(4);
            processed++;
            publish(processed / model.getRowCount() * 100);
        }
        return null;
    }

    @Override
    protected void process(List<Integer> list) {
        progressBar.setValue(list.get(list.size() - 1));
    }
};
worker.execute();

查看 Worker Threads and SwingWorker 小道中的 Concurrency in Swing 部分。

答案 1 :(得分:1)

在进行长时间的后台处理时,您需要使用SwingWorker来更新用户界面。

阅读SwingWorkerConcurency in Swing的tutorail。