0

それは、MAIN クラスに使用しているコードです。

public class Main {

public static void main(String[] args) throws Exception  {

MAINFRAME.GUI();
  }
}

これは、メイン クラスから呼び出されるメインフレーム クラスに関するものです。

public class MAINFRAME extends JFrame {

final static JProgressBar PROGBAR = new JProgressBar(0, 100);
final static JButton BUTTON = new JButton("START");
final static JFrame FRM = new JFrame();

private static ZipFile zipFile;
static BufferedInputStream bis;
static java.io.BufferedOutputStream bout;
static java.io.BufferedInputStream in;


     public static void GUI() throws Exception {

     //Some frame code

     frm.add(PROGBAR);
     frm.add(BUTTON);

     //Some more frame code

     BUTTON.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
            try {
              MAINFRAME.DOWNLOAD();
                }
            catch (Exception e1) {
               e1.printStackTrace();
                }
             }
       });

     //Some more code

     public static final void DOWNLOAD() throws Exception {
       try {
        URL url=new URL(URLHERE);
        HttpURLConnection connection =
             (HttpURLConnection) url.openConnection();
         int filesize = connection.getContentLength();
         float totalDataRead=0;
             in = new java.io.BufferedInputStream(connection.getInputStream());
             java.io.FileOutputStream fos = new java.io.FileOutputStream(FILE);
             bout = new BufferedOutputStream(fos,1024);
             byte[] data = new byte[1024];
             int i=0;
             while((i=in.read(data,0,1024))>=0)
             {
             totalDataRead=totalDataRead+i;
             bout.write(data,0,i);
             float Percent=(totalDataRead*100)/filesize;
             PROGBAR.setValue((int)Percent);
             }

             bout.close();
             in.close();
      }
  }
  catch(Exception e)
  {
       System.out.println("Error");         
  }
}

ダウンロードの解凍など、すべて正常に動作しますが、進行状況を示すバーは操作が終了するまでフリーズしたままになり、プロセスが終了すると 100% になります。ここにそれを適用し、それがどのように機能するか、事前に感謝します

4

1 に答える 1

2

UI のブロックを回避するには、実行時間の長いタスクを別のスレッドに配置する必要があります。

BUTTON.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    new Thread(new Runnable() {

                        @Override
                        public void run() {
                            MAINFRAME.DOWNLOAD();
                        }
                    }).start();
                } catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
        });

を使用することもできますSwingWorker。これについては、回答済みの質問があります。

于 2014-04-08T17:26:45.330 に答える