0

[ダウンロードの開始] ボタンをクリックするとダウンロードが開始される GUI を使用して、ダウンロードするための HTTP リンクを試しています。私を助けてください。

これがコードです

ダウンロードの開始時と完了時にラベルが変わるはずです。

public class SwingGUI2 extends javax.swing.JFrame {    
private javax.swing.JLabel jLabel1;
private javax.swing.JButton jButton1;
private URLConnection connect;

private SwingGUI2() {
    setLayout(new FlowLayout());

    jLabel1 = new javax.swing.JLabel();
    jLabel1.setText("");
    add(jLabel1);

    jButton1 = new javax.swing.JButton();
    jButton1.setText("Start Download");
    add(jButton1);

    jButton1.addActionListener(new java.awt.event.ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            jButton1ActionPerformed(e);
        }
    });


    pack();
}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    jLabel1.setText("Download Started");  //NOT WORKING
    try {
        String DownURL = "http://www.number1seed.com/music/flymetothemoon.mp3";
        URL url = new URL(DownURL);
        connect = url.openConnection();
        File file = new File("download");

        BufferedInputStream BIS = new BufferedInputStream(connect.getInputStream());
        BufferedOutputStream BOS = new BufferedOutputStream(new FileOutputStream(file.getName()));
        int current;
        while((current = BIS.read())>=0) BOS.write(current);
        BOS.close();
        BIS.close();

        jLabel1.setText("Completed");   //NOT WORKING

    } catch (Exception e) {}
}


public static void main(String[] args) throws ClassNotFoundException, InstantiationException {
    try {
        javax.swing.UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (IllegalAccessException ex) {
        Logger.getLogger(SwingGUI2.class.getName()).log(Level.SEVERE, null, ex);
    } catch (UnsupportedLookAndFeelException ex) {
        Logger.getLogger(SwingGUI2.class.getName()).log(Level.SEVERE, null, ex);
    }

    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            SwingGUI2 gui = new SwingGUI2();
            gui.setVisible(true);
            gui.setSize(300,200);
            gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    });
}

}

4

2 に答える 2

1

イベント ディスパッチャ スレッドからダウンロードを実行しようとしており、タスクの実行中に GUI がフリーズします。

バックグラウンド スレッドとしてダウンロード タスクを実行するには、SwingWorkerを参照してください。メソッドactionPerformedは次のようになります。

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    jLabel1.setText("Download Started"); 
    SwingWorker sw = new SwingWorker() {
            public Object doInBackground(){
                try {
                    // ...
                    // Do the whole download thing
                } catch (Exception e) {
                    e.printStackTrace();
                }

                jLabel1.setText("Completed");
                return null;
            }
        };
    sw.execute();
}

注意: この catch で例外を飲み込まないように注意してください。

于 2012-09-26T14:58:25.533 に答える
0

Event Dispatch Thread でダウンロードを実行していますが、これは間違っています。これにより、EDT スレッドがダウンロード以外の処理を実行できなくなります。

ダウンロードは別のスレッドで行う必要があり、ラベルの更新が開始されます。

于 2012-09-26T14:58:55.080 に答える