0

私がやろうとしているのは、ボタンをクリックすると、usb などのポータブル ドライブからいくつかのファイルをコピーし、それらのファイルをローカル ドライブにコピーしてから、以前にコピーしたすべての csv ファイルを読み取り、その値を arraylist に入れることです。それをデータベースに挿入すると、それらのファイルを削除でき、プロセスの完了に基づいて進行中のプロセスバーを表示したいと考えています。だからこれは私がすることです:

           void main()
            {
             JButton btnTransfer = new JButton("Transfer");
                         Image transferIMG = ImageIO.read(new File("C:\\Users\\User\\Desktop\\images\\transfer.png"));
                         btnTransfer.setIcon(new ImageIcon(transferIMG));
                         btnTransfer.setPreferredSize(new Dimension(110, 90));
                         btnTransfer.setOpaque(false);
                         btnTransfer.setContentAreaFilled(false);
                         btnTransfer.setBorderPainted(false);
                         btnTransfer.setVerticalTextPosition(SwingConstants.BOTTOM);
                         btnTransfer.setHorizontalTextPosition(SwingConstants.CENTER);
                         btnTransfer.addActionListener(new ActionListener()
                         {
                              public void actionPerformed(ActionEvent e)
                              {
                                  File csvpath = new File(fileList1.getSelectedValue() + "\\salestablet\\report\\csv");
                                  File htmlpath = new File(fileList1.getSelectedValue() + "\\salestablet\\report\\html");
                                  String removepath = fileList1.getSelectedValue() + "\\salestablet\\report";

                                  if(csvpath.listFiles().length > 0 && htmlpath.listFiles().length > 0)
                                  {
                                       File[] csvarr = csvpath.listFiles();
                                       File[] htmlarr = htmlpath.listFiles();

                                       try 
                                       {
                                            copyFileUsingStream(csvarr, htmlarr, txt.getText(), removepath);
                                       } 
                                       catch (IOException e1) 
                                       {
                                           // TODO Auto-generated catch block
                                           e1.printStackTrace();
                                       }
                                 }
                              }
                         });

         JPanel ButtonCont = new JPanel(new GridLayout(4, 1, 5, 0));
                     ButtonCont.setBackground(Color.LIGHT_GRAY);

                     ButtonCont.add(btnTransfer);

         gui.add(ButtonCont , BorderLayout.EAST);

                     frame.setContentPane(gui);
                     frame.setExtendedState(Frame.MAXIMIZED_BOTH);  
                     frame.setMinimumSize(new Dimension(900, 100));
                     frame.pack();
                     frame.setLocationByPlatform(true);
                     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                     frame.setVisible(true);         
            }

      private static void copyFileUsingStream(File[] csvsources, File[] htmlsources, String dest, String removepath) throws IOException  
          {
               int count = 0;
               int MaxCount = countprocess(csvsources, htmlsources);

               progressBar =  new JProgressBar(0, MaxCount);
               progressBar.setStringPainted(true);

                InputStream is = null;
                OutputStream os = null;

                String csvfolderpath = dest + "\\csv";
                String htmlfolderpath = dest + "\\html";

                if(!(new File(csvfolderpath)).exists())
                {
                    (new File(csvfolderpath)).mkdirs(); //create csv folder;
                }

                if(!(new File(htmlfolderpath)).exists())
                {
                    (new File(htmlfolderpath)).mkdirs(); //create csv folder;
                }

                for(int i= 0; i < csvsources.length; i++) //copy all csv files to csv folder
                {
                    try 
                    {
                        is = new FileInputStream(csvsources[i]);
                        os = new FileOutputStream(csvfolderpath + "\\" + csvsources[i].getName());
                        byte[] buffer = new byte[1024];
                        int length;

                        while ((length = is.read(buffer)) > 0) 
                        {
                            os.write(buffer, 0, length);
                        }
                    }
                    finally
                    {
                        count += 1;
                        progressBar.setValue((count / MaxCount) * 100);
                        //progressBar.repaint();
                        //progressBar.revalidate();
                        progressBar.update(progressBar.getGraphics());

                        is.close();
                        os.close();
                    }
                }

                for(int i= 0; i < htmlsources.length; i++) //copy all html, images and css to html folder
                {
                    if(htmlsources[i].isFile())
                    {
                        try 
                        {
                            is = new FileInputStream(htmlsources[i]);
                            os = new FileOutputStream(htmlfolderpath + "\\" + htmlsources[i].getName());
                            byte[] buffer = new byte[1024];
                            int length;

                            while ((length = is.read(buffer)) > 0) 
                            {
                                os.write(buffer, 0, length);
                            }
                        }
                        finally
                        {
                            count += 1;
                            progressBar.setValue((count / MaxCount) * 100);
                            //progressBar.repaint();
                            //progressBar.revalidate();
                            progressBar.update(progressBar.getGraphics());

                            is.close();
                            os.close();
                        }
                    }
                    else if(htmlsources[i].isDirectory()) //for subfolder
                    {
                        String path = dest + "\\html\\" + htmlsources[i].getName();

                        if(!new File(path).exists())
                        {
                            (new File(path)).mkdirs(); //create subfolder;
                        }

                        File[] arr = (new File(htmlsources[i].getAbsolutePath())).listFiles();      

                        for(int j = 0; j < arr.length; j++)
                        {
                            if(arr[j].isFile())
                            {
                                try 
                                {
                                    is = new FileInputStream(arr[j]);
                                    os = new FileOutputStream(path + "\\" + arr[j].getName());
                                    byte[] buffer = new byte[1000000];
                                    int length;

                                    while ((length = is.read(buffer)) > 0) 
                                    {
                                        os.write(buffer, 0, length);
                                    }
                                }
                                finally
                                {
                                    if(htmlsources[i].getName().contains("images"))
                                    {
                                        count += 1;
                                        progressBar.setValue((count / MaxCount) * 100);
                                        //progressBar.repaint();
                                        //progressBar.revalidate();
                                        progressBar.update(progressBar.getGraphics());
                                    }

                                    is.close();
                                    os.close();
                                }
                            }
                        } 
                    }
                }

                ArrayList<String > DBValues = new ArrayList<String>(); //read all csv files values

                File f1 = new File(csvfolderpath); 
                for(int i = 0; i < f1.listFiles().length; i++)
                {
                     if(f1.listFiles()[i].isFile())
                     {
                        FileReader fl = new FileReader(f1.listFiles()[i]);
                        BufferedReader bfr = new BufferedReader(fl);    

                        for(int j = 0; j < 2; j++)
                        {
                            if(j == 1)
                            {
                                DBValues.add(bfr.readLine());

                                count += 1;
                                progressBar.setValue((count / MaxCount) * 100);
                                //progressBar.repaint();     
                                //progressBar.revalidate();
                                progressBar.update(progressBar.getGraphics());
                            }
                            else
                            {
                                bfr.readLine();
                            }
                        }
                        bfr.close();
                     }
                }

                /*for(int x = 0; x < DBValues.size(); x++)
                {
                    //System.out.println(DBValues.get(x));
                }*/

                //removing csv in local computer
                File f2 = new File(csvfolderpath); 
                File[] removelist = f2.listFiles();
                for(int x = 0; x < removelist.length; x++)
                {
                     if(removelist[x].isFile())
                     {
                         removelist[x].delete();

                         count += 1;
                         progressBar.setValue((count / MaxCount) * 100);
                        // progressBar.repaint();     
                         //progressBar.revalidate();
                            progressBar.update(progressBar.getGraphics());
                     }
                }

                //removing csv in device
                File f3 = new File(removepath + "\\csv");
                if(f3.isDirectory())
                {
                    removelist = f3.listFiles();

                   for(int y = 0; y < removelist.length; y++)
                   {
                       try
                       {
                           if(removelist[y].isFile())
                           {
                              //System.out.println(removelist[y].getName());
                              removelist[y].delete();
                              count += 1;
                              progressBar.setValue((count / MaxCount) * 100);
                              //progressBar.repaint();  
                             // progressBar.revalidate();
                            progressBar.update(progressBar.getGraphics());
                           }
                       }
                       catch(Exception e)
                       {
                          System.out.println(e);
                       }
                   }
                }

                //removing html and images in device
                File f4 = new File(removepath + "\\html");
                if(f4.isDirectory())
                {
                   removelist = f4.listFiles();

                   for(int z = 0; z < removelist.length; z++)
                   {
                       try
                       {
                           if(removelist[z].isFile())
                           {
                              removelist[z].delete();

                              count += 1;
                              progressBar.setValue((count / MaxCount) * 100);
                             // progressBar.repaint(); 
                             // progressBar.revalidate();
                            progressBar.update(progressBar.getGraphics());
                           }
                           else if(removelist[z].isDirectory())
                           {
                               if(removelist[z].getName().contains("images"))
                               {
                                   File[] subfolder = removelist[z].listFiles();

                                   for (int idx = 0; idx < subfolder.length; idx++)
                                   {
                                       if(subfolder[idx].isFile())
                                       {
                                          subfolder[idx].delete();

                                          count += 1;
                                          progressBar.setValue((count / MaxCount) * 100);
                                         // progressBar.repaint(); 
                                        //  progressBar.revalidate();
                                        progressBar.update(progressBar.getGraphics());
                                       }
                                   }
                               }
                           }
                       }
                       catch(Exception e)
                       {
                          System.out.println(e);
                       }
                   }
                }

                /*  JProgressBar progressBar = new JProgressBar();
                    progressBar.setValue(25);
                    progressBar.setStringPainted(true);*/
                    Border border = BorderFactory.createTitledBorder("Reading...");
                    progressBar.setBorder(border);


                gui.add(progressBar, BorderLayout.SOUTH);
                gui.repaint();
                gui.revalidate();


                // System.out.println(count);
            }

  private static int countprocess(File[] csv, File[] html_image)
  {
      int x = 0;
      int y = 0;
      int z = 0;

      for(int i = 0; i < csv.length; i++)
      {
          if(csv[i].isFile())
          {
              x += 1;
          }
      } //get total count of csv files throught loop

      for(int i = 0; i < html_image.length; i++)
      {
          if(html_image[i].isFile())
          {
              y += 1;
          }
          else if(html_image[i].isDirectory())
          {
              if(html_image[i].getName().contains("images"))
              {
                  File[] flist = html_image[i].listFiles();

                  for(int j = 0; j < flist.length; j++)
                  {
                      z += 1;
                  }
              }
          }  //get total count of html and images files throught loop
      }

      return ((4*x) + (2*y) + (2*z));
  }

だから私はこのように値を設定してプログレスバーの値を更新しようとしました

progressBar.setValue((count / MaxCount) * 100);

しかし、どういうわけか私はそれを機能させることができません.私の進行状況バーは1%2%3%.. 10%などの進行状況を示していません..代わりに、プロセスが完了したときに100%しか表示されません..私が見逃しているものここ?注:私はまた、この方法でプログレスバーの値を設定しようとしましたが、progressBar.setValue(count);まだうまくいきません。

4

2 に答える 2

1

コード全体のレビューには時間がかかります。ただし、btnTransfer.addActionListeneractionPerformed関数内でストリームをコピーしようとしていますが、これには時間がかかる場合があります。あらゆる種類のイベント リスナーは、イベント ディスパッチ スレッドで実行されます。詳細については、この回答を参照してください。

今すぐ簡単な解決策として:

  • copyFileUsingStream(csvarr, htmlarr, txt.getText(), removepath);関数をインライン スレッド内に配置します。

       new Thread()
      {
       public void run()
       {
           copyFileUsingStream(csvarr, htmlarr, txt.getText(), removepath);
      }
    }.start();
    
    } 
    
  • 次のように、進行状況の更新をJProgressBar内部に配置し、そのうちの 1 つを にキャストSwingUtilities.invokeLaterして計算を行います。(count/MaxCount)double

    SwingUtilities.invokeLater(new Runnable() {
    
        @Override
        public void run() {
    
         count += 1;
         progressBar.setValue((int) (((double)count/ MaxCount) * 100));
        }
    });
    

count関数に対してローカルであるため、アクセスcopyFileUsingStreamして変更するには、クラス コンテキストで宣言してみてください。

ただしSwingWorker、この種のタスクには適しています。

チュートリアルのリソース:

  1. ワーカースレッドと SwingWorker
  2. Swing Worker で進行状況バーを使用する方法
  3. SwingWorker を使用した ProgressBar のデモ
于 2013-10-30T19:35:24.503 に答える
0

プログレス バーの値を完了率に設定しています。しかし、プログレス バーの最大値は、実際にはアイテムの総数です。

代わりに、プログレスバーの値を現在のカウントに設定し、% の計算を取り除くだけで済みます。

何かのようなもの:

progressBar.setValue(count );

また、GUI の再描画を強制する必要がないように、SwingWorker スレッドで実行時間の長いタスクを実行する必要があります。

于 2013-10-30T15:56:02.803 に答える