2017-02-28 22 views
2

私は自分のシステムに含まれているファイルをコピーするZIPファイルの共有フォルダの場所を取っている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ポイント/パーセントの割合で表示し、そのようなステップが完了するたびに進捗を向上させます。 (実行時間を前もって測定して、異なるステップに異なる「重み」を与えることもできますし、各ステップを同じ「量」にして最後に「100%」にすることもできます)。

その方法については、それは確かにそのチュートリアルで説明されています!

ここで重要な側面の1つは、スレッドです。あなたの例では、メインスレッドは、進行状況バーのsetValue()を呼び出します。それは動作しません。オラクルtutorialに戻ると、次のように表示されます。

タスクはjavax.swing.SwingWorkerのサブクラスです。タスクインスタンスは、ProgressBarDemoの3つの重要なことを行います。

インスタンスは別のスレッドでdoInBackgroundを呼び出します。これは、長時間実行されるタスクが実際に実行される場所です。イベントディスパッチスレッドの代わりにバックグラウンドスレッドを使用すると、タスクの実行中にユーザーインターフェイスがフリーズすることがなくなります。

バックグラウンドタスクが完了すると、インスタンスはイベントディスパッチスレッドでdoneメソッドを呼び出します。

インスタンスは、進行状況を示すバウンドプロパティを維持します。これは、タスクの進行状況を示すように更新されます。進行状況が変更されるたびにpropertyChangeメソッドが呼び出されます。

+0

私には、例えば – BleedCode

+0

のリンクを教えてもらえますか?jProgressBarの値を変更する反復メソッドを書いていることを確認してください。しかし出力では、最後にjProgressBarが直接表示されます。それは15%から30%に移動していません。これで何が間違っていますか? – BleedCode

+1

更新情報を見る...ポイントは:はい、これは複雑なものです。つまり、一度だけ読んで理解している部分だけをコピー&ペーストするだけではありません。あなたはそれを得るまで、**全体**のものを読んで繰り返し続けます。これが助けてくれることを願って... – GhostCat

-1

簡単です。 ProgressMonitorInputStreamをご覧ください。

関連する問題