2017-01-10 48 views
0

私は基本的に、郵便番号の貼り付けテキストの各行をチェックし、データベース内のローカライゼーションをチェックする小さなアプリケーションをJavaで構築しています。処理中にプログレスバーを更新する

すべて正常に動作しますが、チェックプロセスに時間がかかることがあります。また、行がチェックされるたびにプログレスバーを追加して値を更新したいと考えています。

この件に関する他のスレッドを読んでいるにもかかわらず、プロセスが終了したときに進捗バーのみが更新される理由がわかりません。 私は、GUIをフリーズしない何らかの方法でプログレスバーを自分のプロセスから切り離す必要があることを知りましたが、実際にいくつかの助けをして、それを行う方法と理由を説明することに感謝します。だれでも助けてくれてありがとう!

ここにメインコードがあります。プログレスバーで進捗状況を更新するプロセスは、button2リスナーが起動したプロセスです。

import javax.swing.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.IOException; 

import static sun.security.krb5.Confounder.intValue; 

public class mainform { 
private JButton button1; 
private JTextField txt_1; 
private JPanel panelmain; 
private JLabel outlab; 
private JTextField codepostal; 
private JTextArea paste_lignes; 
private JButton button2; 
private JProgressBar progressBar1; 
private JLabel progress; 




public mainform() { 

    button2.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      String[] lines = paste_lignes.getText().split("\\n"); 
      String resultQPV = ""; 
      int numLines = 0; 

      for (int i = 0; i < lines.length; i++) { 
       numLines++; 
      } 

      System.out.println(numLines); 

      for (int i = 0; i < lines.length; i++) { 
       String adresse = ""; 
       String CP = ""; 
       String[] cells = lines[i].split("\\t"); 
       float percent_d = ((float) i/(float) numLines) * 100; 
       System.out.println(i + " " + numLines + " " + percent_d); 
       int percent = (int) percent_d; 

       progressBar1.setValue(percent); 


       try { 
        Thread.sleep(50); 
       } catch (InterruptedException e1) { 
        e1.printStackTrace(); 
       } 


       for (int j = 0; j < cells.length; j++) { 

        if (CheckAdresse.identify_me(cells[j]) == "CP") { 
         CP = cells[j]; 
        } 

        if (CheckAdresse.identify_me(cells[j]) == "adresse") { 
         adresse = cells[j]; 
        } 

       } 


       String QPV = null; 
       String voie = null; 
       String numero = null; 

       if (adresse == "" || CP == "") { 
        QPV = "erreur sur la ligne"; 
       } else { 
        voie = ParserAdresse.voie(adresse); 
        numero = Integer.toString(ParserAdresse.numVoie(adresse)); 
        try { 
         QPV = CheckAdresse.Check(CP, voie, numero); 
        } catch (IOException e1) { 
         e1.printStackTrace(); 
        } 
       } 


       resultQPV = resultQPV + QPV + "\n"; 


       //System.out.println(i + " " + percent + " " + voie + " " + CP + " " + numero); 

      } 

      paste_lignes.setText(resultQPV); 


     } 
    }); 
} 


public static void main(String[] args) { 
    JFrame frame = new JFrame("mainform"); 
    frame.setContentPane(new mainform().panelmain); 
    frame.setSize(900, 400); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 

} 

}

+0

下のリンクを読むことができますあなた[例](http://stackoverflow.com/questions/5691979/progressbar-doesnt-change-its-value-in-java?rq=1) – Visveswaran

+0

それはトリックでした!このリンクをありがとう、参照スレッドのソリューションは私のために働いた! – Elyss

答えて

0

2つのアクションをしたいだけ1つのスレッドでそれを実行するためです。だから彼らは執行を分かち合う必要があり、パラレルを扱うことはできません。
必要なのは、プログレスバーを別のスレッドで実行することです。
ですから、

  • 1つのスレッドプログレスバーのアプリケーション
  • ため

    • 1つのスレッドを持つことになります

    Javaでスレッドを使用するためにどのように役立つことがあり、ここでhttps://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html

    関連する問題