2

ここにはたくさんのJProgressBar質問がありますが、すべての回答を通して、自分の問題を診断できないようです。アドレス検証ソフトウェアでファイルを処理しています。[処理] ボタンをクリックすると、JProgressBar処理された各ファイルを更新する必要があります。ボタンは次のとおりです。

private JButton getJButton0() {
...
   jButton0.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event) {
         jButton0ActionActionPerformed(event);
         t.start();
      }
...

みんなのお勧めでsetValue()、スレッド内でメソッドを使用しました

Thread t = new Thread(){
    public void run() {
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        jProgressBar0.setValue(BulkProcessor.getPercentComplete());
    }
});
try {
    Thread.sleep(100);
} catch (InterruptedException e) {
}
...

BulkProcessor.getPercentComplete()完了率を表す別のクラスから呼び出しているメソッドです。この方法をテストしたところ、正しく更新されました。問題は、ファイルの処理が完了するまでプログレス バーが更新されず、その後 100% にジャンプすることです。これが繰り返しの質問である場合は申し訳ありませんが、このサイトでいくつかの深刻な調査を行いましたが、うまくいきませんでした. どんな助けでも大歓迎です。

編集:

推奨される複製ごとに、私はこれを試しました:

public void update(){
   new SwingWorker<Void,Void>() {
   protected Void doInBackground() throws Exception {
   jProgressBar0.setValue(BulkProcessor.getPercentComplete());
   return null;
 };
 }.execute();
}

そして、actionPerformed()(で切り替え)の下でこのupdate()メソッドを呼び出してみましt.start()update()。私はまだ同じ問題を抱えています。

編集

user1676075 の推奨事項に基づいていますが、同じ問題があります:

    public static void update(){
       new SwingWorker<Void,Integer>() {
       protected Void doInBackground() throws Exception {
           do
           {
           percentComplete = BulkProcessor.getPercentComplete();
           publish(percentComplete);
           Thread.sleep(100);
           } while(percentComplete < 100);

        return null;
       }
       @Override
    protected
       void process(List<Integer> progress)
       {
           jProgressBar0.setValue(progress.get(0));
       }
     }.execute();
   }

編集

これが私のBulkProcessorクラスのコードです

 private String getOutputLine( String searchString, String inputLine )
throws QasException
{
 ..(code for processing lines)..
 countRecord++;
    percentComplete = (int) Math.round((countRecord/totalRecord)*100);

totalRecordBulkProcessor私のクラスのメインクラスで更新されます

 public static void main( String input, String output ){
    count.clear();
    try{
        String inputFile = input;
        String outputFile = output;
        LineNumberReader  lnr = new LineNumberReader(new FileReader(new File(input)));
        lnr.skip(Long.MAX_VALUE);
        totalRecord = lnr.getLineNumber() + 1; //line count in file
        BulkProcessor bulk = new BulkProcessor(inputFile, outputFile, ConfigManager.DFLT_NAME);
        bulk.process();
    }catch(Exception e ){
        e.printStackTrace();
    }

}
4

4 に答える 4

0

PropertyChangeListenerインターフェイスを使用しようとしましたか?

計算は Swingworker スレッドによって行われ、main-gui はこのインターフェースを実装します。いくつかのサンプルコード

@Override
public void actionPerformed(ActionEvent e) {
    this.myButton.setEnabled(false);
    MyWorkerThread thread = new MyWorkerThread(); //Data-processing
    thread.addPropertyChangeListener(this.mainguiframe); //Separation of concern
    thread.execute();
}

何かが発生した場合、swing-worker-thread の「setProgress」メソッドを使用すると、メイン GUI スレッドに通知されます。

@Override
public void propertyChange(PropertyChangeEvent property) {
     Integer currentValue = new Integer(0);
     currentValue = (Integer) property.getNewValue();
     this.progressBar.setValue(currentValue.intValue());
}

Swing はスレッドセーフではありません。これは最善の解決策ではありませんが、おそらく役立つでしょう。ひどい間違いがあればコメントしてください。

于 2013-06-24T22:16:34.823 に答える
0

使用法を混在させているようです。SwingWorker のドキュメントの上部にある例を参照してください: http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html

理想的には、SwingWorker の doInBackground メソッドで BulkProcessor を更新し、それによって setProgress が呼び出され、jProgressBar が例のように進行状況の更新をリッスンします。

それがうまくいかない場合は、上記に基づいていないように思われますが、ボタンを押すイベントから SwingWorker を開始します。SwingWorker メソッドを次のように実装します (疑似コード):

new SwingWorker<Void,Integer>()
{
  doInBackground()
  {
    do
    {
      percentComplete = BulkProcessor.getPercentComplete();
      publish(percentCompete);
      Thread.sleep(100);
    } while (percentComplete < 100);
  }

  @Override
  process(List<Integer> progress)
  {
     jProgressBar0.setValue(progress.get(0));
  }
}.execute();

エラー処理と、完全なケースと失敗したケースのチェックを追加する必要がありますが、それで開始して、目的の場所に到達できるはずです。doInBackground はバックグラウンド スレッドで実行されるため、何もブロックされず、process() は Swing ワーカー スレッドで実行されるため、更新がポストされます。

于 2013-06-17T20:08:37.320 に答える