2017-02-28 1 views
2

나는 내 시스템에 포함 된 파일을 복사하는 압축 파일의 공유 폴더 위치를 가져 오는 UI를 개발했습니다. 작업을 수행하고 다시 기계 위치에 저장하는 작업은 모두 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 points/percent를 부여하고 이러한 단계가 완료 될 때마다 진행률을 높입니다. (실행 단계를 미리 측정하여 서로 다른 단계에 다른 "가중치"를 부여하거나, 각 단계가 동일한 "금액"을 제공하여 결국 "100 %"에 도달하도록 만들 수 있습니다.)

메 커닉 방법은 해당 튜토리얼에서 설명합니다.

여기서 핵심적인 측면은 스레드입니다. 귀하의 예에서 스레드는 진행률 표시 줄에서 setValue()을 호출합니다. 그것은 작동하지 않습니다. 오라클 tutorial으로 돌아 가면 거기에 있습니다 :

작업은 javax.swing.SwingWorker의 하위 클래스입니다. Task 인스턴스는 ProgressBarDemo에 대해 세 가지 중요한 작업을 수행합니다.

인스턴스가 별도의 스레드에서 doInBackground를 호출합니다. 이것은 장기 실행 작업이 실제로 실행되는 곳입니다. 이벤트 디스패치 스레드 대신 백그라운드 스레드를 사용하면 작업이 실행되는 동안 사용자 인터페이스가 멈추는 것을 방지 할 수 있습니다.

백그라운드 작업이 완료되면 인스턴스는 이벤트 발송 스레드에서 done 메소드를 호출합니다.

인스턴스는 진행률을 나타내는 바운드 속성을 유지 관리하며,이 속성은 작업 진행률을 나타내도록 업데이트됩니다. propertyChange 메서드는 진행률이 변경 될 때마다 호출됩니다.

+0

예를 들어 어떤 링크 나 제안 할 수 – BleedCode

+0

나는 jProgressBar의 값을 변경합니다 iterate 방법을 작성했습니다. 그러나 출력에서는 끝에 jProgressBar가 직접 표시됩니다. 그것은 15 %에서 30 %로 이동하지 않습니다. 이게 뭐야? – BleedCode

+1

내 업데이트보기 ... 요점은 : 네, 이것은 복잡한 일입니다. 즉, 일단 읽은 다음 이해하는 부분 만 복사하여 붙여 넣으면됩니다. 당신이 그것을 얻을 때까지 ** 전체 ** 것을 읽고 계속 반복합니다. 희망이 도움이 ... – GhostCat

-1

쉬운. ProgressMonitorInputStream을보십시오.

관련 문제