【问题标题】:Indeterminate Progress bar wont show不确定的进度条不会显示
【发布时间】:2013-06-29 15:58:35
【问题描述】:

我有一个将文件(通过 ADB)复制到安卓平板电脑的应用程序。这需要一些时间,所以我想显示一个带有不确定进度条的弹出窗口。复制任务完成后,我希望能够停止进度条并让用户关闭对话框。

目前我还没有添加额外的对话框,只是想让进度条正常工作。我遇到的问题是任务开始时没有显示进度条,但我不知道为什么。当出现同步完成对话框时会显示进度条。代码是:

        progress = new JProgressBar(0, 100);
        progress.setForeground(new Color(255, 99, 71));
        progress.setIndeterminate(true);
        progress.setValue(0);
        progress.setPreferredSize( new Dimension( 300, 20 ) );
        progress.setBounds( 278, 12, 260, 20 );
        progress.setVisible(false);
        progress.setString("Sync in progress");
        progress.setStringPainted(true);
        contentPane.add(progress);
        pushtotab = new JButton("");
        pushtotab.addActionListener(new ActionListener() {


 public void actionPerformed(ActionEvent arg0) {
                        if (buildpathset==1){
                            try{
                            setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                            progress.setVisible(true);
                            wiredsync();
                        }finally{
                            JOptionPane.showMessageDialog(null, "sync complete. ",null, buildpathset);
                             setCursor(Cursor.getDefaultCursor());      
                             progress.setVisible(false);
                        }}else{ 
    //warning in here later - TO Do
                }
                }
                });

public void wiredsync(){

        try {

                    Process process = Runtime.getRuntime().exec("adb" + " push "+ buildpath + " " + adbtabletsync);
                    InputStreamReader reader = new InputStreamReader(process.getInputStream());
                    Scanner scanner = new Scanner(reader);
                    scanner.close();
                    int exitCode = process.waitFor();
                    System.out.println("Process returned: " + exitCode);

                } catch(IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    }//end 

谢谢你的帮助,

安迪

【问题讨论】:

    标签: java multithreading swing jprogressbar


    【解决方案1】:

    pooyan 的想法是正确的——在后台线程中执行长时间运行的进程——但给出了错误的库示例,因为您的程序是 Swing 程序而不是 Android 程序。 Swing 对此的典型答案是在 SwingWorker 的 doInBackground() 方法中执行您的长时间运行的任务。

    请稍等,我会找到更好的例子...

    类似这样的:

    if (buildpathset == 1) {
       setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
       progress.setVisible(true);
    
       // create my SwingWorker object
       final SwingWorker<Void, Void> myWorker = new SwingWorker<Void, Void>() {
          protected Void doInBackground() throws Exception {
             // here is my long running task, calling in background
             // thread
             wiredsync();
             return null;
          };
       };
    
       // this allows me to be notified when the SwingWorker has
       // finished
       myWorker.addPropertyChangeListener(new PropertyChangeListener() {
    
          @Override
          public void propertyChange(PropertyChangeEvent pcEvt) {
             // if the SwingWorker is done
             if (pcEvt.getNewValue() == SwingWorker.StateValue.DONE) {
                // notify the user
                JOptionPane.showMessageDialog(null, "sync complete. ",
                      null, buildpathset);
                setCursor(Cursor.getDefaultCursor());
                progress.setVisible(false);
    
                try {
                   // one way to catch any errors that occur in
                   // SwingWorker
                   myWorker.get();
                } catch (InterruptedException | ExecutionException e) {
                   e.printStackTrace();
                }
    
             }
          }
       });
       // run my SwingWorker
       myWorker.execute();
    } else {
       // warning in here later - TO Do
    }
    

    更多详情,请查看:Lesson: Concurrency in Swing

    【讨论】:

    • 谢谢。它起作用了(尽管我必须更改为 JRE7,因为我使用的是 6 并且无法处理多个异常捕获。有点小问题,但破解了它)。工作谢谢!
    • @andy:如果将 catch 块更改为两个 catch 块,则可以继续使用 JRE6。很高兴它有效,但请务必阅读底部的链接,以便您完全理解它为什么有效。运气!
    【解决方案2】:

    我认为您的问题是您不使用 thread 。我的意思是在您将进度条的可见性设置为 true 之后,您应该在线程中定义您的长任务。我不熟悉 Swing 但是 在那里寻找 Swing (对不起,如果它没有用完): http://www.java-tips.org/java-se-tips/javax.swing/how-to-handle-long-running-tasks-in-a-swing-applic.html

    还有安卓版:http://www.mkyong.com/android/android-progress-bar-example/

    【讨论】:

      猜你喜欢
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-15
      • 2011-09-20
      • 1970-01-01
      相关资源
      最近更新 更多