2017-02-28 52 views
2

我开发了一个用户界面,在该用户界面中,我将压缩文件的共享文件夹位置复制到我的系统中。对此进行一些操作并将其存储到机器位置,所有这些都是使用UI完成的。对于这个现在我想使用JProgressBar,但我不知道如何与线程的帮助下,我会衡量进展。我看到JProgressBar的教程,但没有帮助。我已经写如何在java中测量JProgressBar的任务进度

代码:

import java.awt.Toolkit; 
import java.awt.event.*; 
import javax.swing.*; 
import java.beans.*; 
import java.util.Random; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
public class ProgressBar extends javax.swing.JFrame { 
/** 
* Creates new form ProgressBar 
*/ 


public ProgressBar() { 

    initComponents(); 

} 

/** 
* This method is called from within the constructor to initialize the form. 
* WARNING: Do NOT modify this code. The content of this method is always 
* regenerated by the Form Editor. 
*/ 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code">       
private void initComponents() { 

    jButton1 = new javax.swing.JButton(); 
    jProgressBar1 = new javax.swing.JProgressBar(); 
    jTextField1 = new javax.swing.JTextField(); 
    jScrollPane1 = new javax.swing.JScrollPane(); 
    jTextArea1 = new javax.swing.JTextArea(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    jButton1.setText("ok"); 
    jButton1.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      jButton1ActionPerformed(evt); 
     } 
    }); 

    jProgressBar1.setStringPainted(true); 

    jTextArea1.setColumns(20); 
    jTextArea1.setRows(5); 
    jScrollPane1.setViewportView(jTextArea1); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
        .addGap(68, 68, 68) 
        .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 119, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addGap(44, 44, 44) 
        .addComponent(jButton1)) 
       .addGroup(layout.createSequentialGroup() 
        .addGap(150, 150, 150) 
        .addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 167, javax.swing.GroupLayout.PREFERRED_SIZE))) 
      .addContainerGap(298, Short.MAX_VALUE)) 
     .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
      .addGap(0, 0, Short.MAX_VALUE) 
      .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(99, 99, 99)) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGap(41, 41, 41) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
       .addComponent(jButton1) 
       .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
      .addGap(46, 46, 46) 
      .addComponent(jProgressBar1, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(48, 48, 48) 
      .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addContainerGap(91, Short.MAX_VALUE)) 
    ); 

    pack(); 
}// </editor-fold>       

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    // TODO add your handling code here: 

    iterate(); 

}           

/** 
* @param args the command line arguments 
*/ 
public static void main(String args[]) { 
    /* Set the Nimbus look and feel */ 
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
    /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
    * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
    */ 
    try { 
     for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
      if ("Nimbus".equals(info.getName())) { 
       javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
       break; 
      } 
     } 
    } catch (ClassNotFoundException ex) { 
     java.util.logging.Logger.getLogger(ProgressBar.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (InstantiationException ex) { 
     java.util.logging.Logger.getLogger(ProgressBar.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (IllegalAccessException ex) { 
     java.util.logging.Logger.getLogger(ProgressBar.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
     java.util.logging.Logger.getLogger(ProgressBar.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
    } 
    //</editor-fold> 

    /* Create and display the form */ 
    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new ProgressBar().setVisible(true); 

    }); 
} 

public void iterate() 
    { 
     int i = 0; 
     while(i<=100){  
     jProgressBar1.setValue(i);  
     i=i+15; 

     try{Thread.sleep(700);}catch(Exception e){}  
    }  
    } 

// Variables declaration - do not modify      
private javax.swing.JButton jButton1; 
private javax.swing.JProgressBar jProgressBar1; 
private javax.swing.JScrollPane jScrollPane1; 
private javax.swing.JTextArea jTextArea1; 
private javax.swing.JTextField jTextField1; 
// End of variables declaration     
} 
+0

我会开始使用'SwingWorker',[例如](http://stackoverflow.com/questions/24835638/issues-with-swingworker-and-jprogressbar/24835935#24835935)。这个问题将试图确定你需要做的工作量 – MadProgrammer

回答

3

关键的一点是,你第一定义可以测量报告对你的进步的值。

例如:对于上面列出的每个步骤,您给予15,20点/%,并且每次完成这样的步骤时,您都会增加进度。 (您可以尝试预先测量执行时间,为不同步骤提供不同的“权重”;或者您可以简单地使每个步骤贡献相同的“量”,最终达到“100%”)。

对于力学如何,这是肯定在该教程中描述!

这里的一个关键方面是线程。在您的示例中,您的主线程线程在进度条上调用setValue()。这是行不通的。当您回到oracle tutorial时,您会发现:

任务是javax.swing.SwingWorker的子类。任务实例对ProgressBarDemo有三件重要的事情:

该实例在单独的线程中调用doInBackground。这是长期运行的任务实际执行的地方。使用后台线程而不是事件分派线程可防止用户界面在任务运行时冻结。

当后台任务完成时,实例调用event-dispatch线程中的done方法。

该实例维护一个绑定属性progress,该属性被更新以指示任务的进度。每次进程更改时都会调用propertyChange方法。

+0

你可以建议我任何链接例如 – BleedCode

+0

检查我已经写了一个迭代方法,它将改变jProgressBar的值。但是在输出中直接显示jProgressBar。它并没有从15%上升到30%。这有什么不对? – BleedCode

+1

查看我的更新...重点是:是的,这是复杂的东西。这意味着:你不只是阅读一次,只复制和粘贴你理解的部分。你继续阅读并重复**整个**的东西,直到你得到它。希望这有助于... – GhostCat

-1

简单。看看ProgressMonitorInputStream