【问题标题】:JProgressBar while data loading in swingJProgressBar 在摆动数据加载时
【发布时间】:2012-11-13 18:48:14
【问题描述】:

我有一个来自 UI 的服务器调用。它的响应时间有点高。所以我想在从服务器加载数据期间显示一个进度条。我已经使用approach 尝试了以下代码来显示进度条。一些我做错的地方当我在按钮单击时调用calculateResult() 方法时,我没有看到进度条。我不需要在进度条上显示任何百分比。它只需要显示数据正在加载。

//下面的代码我试过了。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

 public class MyProgressBarTest extends JFrame {
private static final long serialVersionUID = 1L;

private static JProgressBar progressBar;

public static void main(String[] args) {
    MyProgressBarTest obj = new MyProgressBarTest();
    obj.createGUI();
}

public void createGUI() {
    JPanel panel = new JPanel();
    JButton button = new JButton("Progress");

    progressBar = new JProgressBar();

    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {

            MyCustomProgressBarDialog progressBarObj = new    MyCustomProgressBarDialog(progressBar);
            progressBarObj.createProgressUI();

            MyActionPerformer actionObj = new MyActionPerformer(progressBar);
            actionObj.execute();

            progressBarObj.setVisible(false);
        }
    });

//      panel.add(progressBar);
    panel.add(button);
    add(panel);

    setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    setLocationRelativeTo(null);
//      pack();
    setSize(200, 300);
    setVisible(true);
}
}

class MyActionPerformer extends SwingWorker<String, Object> {

JProgressBar fProgressBar;

public MyActionPerformer(JProgressBar progressBar) {
    this.fProgressBar = progressBar;
    this.fProgressBar.setVisible(true);
    this.fProgressBar.setIndeterminate(true);
}

protected String doInBackground() throws Exception {

    calculateResult();
    return "Finished";
}

protected void done() {
    fProgressBar.setVisible(false);
}

public void calculateResult() {
    for (int i = 0; i < 500000; i++) {
        System.out.println("Progress Bar: " + i);
    }
}
}

class MyCustomProgressBarDialog extends JDialog {
private static JProgressBar progressBar;

public MyCustomProgressBarDialog(JProgressBar progressBar) {
    this.progressBar = progressBar;
}

public void createProgressUI() {
    add(progressBar);
    setLocationRelativeTo(null);
    setSize(50, 20);
    setVisible(true);
}
}

【问题讨论】:

  • 您不应干扰doInBackground 方法中的进度条。该方法在后台(d'oh)而不是在 EDT 上运行,因此您不应修改/访问其中的摇摆组件。将它们移至您的构造函数或创建 SwingWorker 实例的位置
  • @Robin 我已经编辑了我的代码。但是我的进度对话框在方法完成之前关闭。我怎样才能让它等到方法调用完成然后自动关闭它。
  • 我添加了一个解决这个问题的答案。包含在评论中有点长

标签: java swing swingworker jprogressbar


【解决方案1】:

您的进度条立即消失的原因是您的ActionListener

button.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent arg0) {
   MyCustomProgressBarDialog progressBarObj = new    MyCustomProgressBarDialog(progressBar);
   progressBarObj.createProgressUI();

   MyActionPerformer actionObj = new MyActionPerformer(progressBar);
   actionObj.execute();

   progressBarObj.setVisible(false);
  }
});

actionObj.execute(); 方法不是阻塞的(好事,否则将无用),这意味着在您使用该调用启动 SwingWorker 后,您将立即执行 progressBarObj.setVisible(false); 语句。

这会导致进度条对话框消失。

我可以想到 2 个解决方案

  • 也将对话框传递给SwingWorker,并在SwingWorkerdone 方法中对对话框调用setVisible( false )
  • SwingWorker 触发 PropertyChangeEvents,这使您可以确定它的进展程度。您可以使用这样的侦听器在计算完成时隐藏对话框

【讨论】:

  • 谢谢 :) .. 我已经使用第一个解决方案完成了。但是哪个真的好学……第一个还是第二个使用 PropertyChangeEvent?
  • @Che 我会说这是一个品味问题。我个人更喜欢第一个
【解决方案2】:

您看不到进度条,因为您没有将其添加到面板中

一个简单的:

panel.add(PROGRESS_BAR);
panel.add(button);

会成功的。

我希望它有所帮助。干杯

【讨论】:

    【解决方案3】:

    JProgressBarComponent。它必须添加到Container 才能可见。你还没有在任何地方添加你的。

    【讨论】:

    • +1 .. Yaa .. 它工作了.. 但我需要它作为一个单独的框架出现在主框架的顶部。我该怎么做..
    • 创建一个单独的 JDialog 并为其添加进度条。小心穿线部分。
    • 感谢您的建议。正如你所说,我现在有一个线程问题。在我的方法完成之前,我的进度对话框正在关闭。我已经更新了我的代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2015-05-27
    • 2017-03-14
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    相关资源
    最近更新 更多