1

ファイルを(ADB経由で)Androidタブレットにコピーするアプリケーションがあります。時間がかかるので、不確定なプログレスバーが表示されたポップアップを表示したい。コピー タスクが完了したら、プログレス バーを停止して、ユーザーがダイアログを閉じられるようにしたいと考えています。

現時点では、追加のダイアログ ボックスを追加しておらず、進行状況バーを機能させようとしています。私が抱えている問題は、タスクの開始時に進行状況バーが表示されないことですが、その理由はわかりません. 同期が完了したことを示すダイアログ ボックスが表示されると、進行状況バーが表示されます。コードは次のとおりです。

        progress = new JProgressBar(0, 100);
        progress.setForeground(new Color(255, 99, 71));
        progress.setIndeterminate(true);
        progress.setValue(0);
        progress.setPreferredSize( new Dimension( 300, 20 ) );
        progress.setBounds( 278, 12, 260, 20 );
        progress.setVisible(false);
        progress.setString("Sync in progress");
        progress.setStringPainted(true);
        contentPane.add(progress);
        pushtotab = new JButton("");
        pushtotab.addActionListener(new ActionListener() {


 public void actionPerformed(ActionEvent arg0) {
                        if (buildpathset==1){
                            try{
                            setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
                            progress.setVisible(true);
                            wiredsync();
                        }finally{
                            JOptionPane.showMessageDialog(null, "sync complete. ",null, buildpathset);
                             setCursor(Cursor.getDefaultCursor());      
                             progress.setVisible(false);
                        }}else{ 
    //warning in here later - TO Do
                }
                }
                });

public void wiredsync(){

        try {

                    Process process = Runtime.getRuntime().exec("adb" + " push "+ buildpath + " " + adbtabletsync);
                    InputStreamReader reader = new InputStreamReader(process.getInputStream());
                    Scanner scanner = new Scanner(reader);
                    scanner.close();
                    int exitCode = process.waitFor();
                    System.out.println("Process returned: " + exitCode);

                } catch(IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    }//end 

助けてくれてありがとう、

アンディ

4

2 に答える 2

2

pooyan は正しい考えを持っています -- バックグラウンド スレッドで長時間実行されるプロセスを実行します -- しかし、あなたのプログラムは Android プログラムではなく Swing プログラムであるため、間違ったライブラリの例を示しています。これに対する Swing の標準的な答えは、長時間実行されるタスクをdoInBackground()SwingWorker のメソッドで実行することです。

より良い例を見つけるまでお待ちください...

そのようなもの:

if (buildpathset == 1) {
   setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
   progress.setVisible(true);

   // create my SwingWorker object
   final SwingWorker<Void, Void> myWorker = new SwingWorker<Void, Void>() {
      protected Void doInBackground() throws Exception {
         // here is my long running task, calling in background
         // thread
         wiredsync();
         return null;
      };
   };

   // this allows me to be notified when the SwingWorker has
   // finished
   myWorker.addPropertyChangeListener(new PropertyChangeListener() {

      @Override
      public void propertyChange(PropertyChangeEvent pcEvt) {
         // if the SwingWorker is done
         if (pcEvt.getNewValue() == SwingWorker.StateValue.DONE) {
            // notify the user
            JOptionPane.showMessageDialog(null, "sync complete. ",
                  null, buildpathset);
            setCursor(Cursor.getDefaultCursor());
            progress.setVisible(false);

            try {
               // one way to catch any errors that occur in
               // SwingWorker
               myWorker.get();
            } catch (InterruptedException | ExecutionException e) {
               e.printStackTrace();
            }

         }
      }
   });
   // run my SwingWorker
   myWorker.execute();
} else {
   // warning in here later - TO Do
}

詳細については、こちらをご覧ください:レッスン: Swing での同時実行

于 2013-06-29T16:28:21.937 に答える
2

あなたの問題は、スレッドを使用していないことだと思います。つまり、プログレス バーの可視性を true に変更した後、長いタスクをスレッドで定義する必要があります。私はSwingに慣れていませんが、Swingを探してください(役に立たない場合は申し訳ありません): http://www.java-tips.org/java-se-tips/javax.swing/how-to-handle- long-running-tasks-in-a-swing-applic.html

Android用もあります:http://www.mkyong.com/android/android-progress-bar-example/

于 2013-06-29T16:11:03.007 に答える