Pobieranie pliku + pasek postępu

0

Witam,

Napisałem prosty kod pobierający pliku .mp3 z wrzuta.pl na dysk. Postanowiłem wprowadzić tam postęp pobierania pliku, niestety nie działa on podczas gdy plik jest pobierany, tylko zaktualizuje się po jego pobraniu (nie działa repaint() ?).

Próbowałem wprowadzić 2 wątek który ma za zadanie odmalowywanie okna lecz to nic nie dało.
Niewiem czy ogólna koncepcja którą zrobiłem jest dobra...

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package zrzuta;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import java.util.Timer;
import java.util.TimerTask;

/**
 *
 * @author Marek
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                Frame frame = new Frame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.show();
            }
        });
    }

}

class Frame extends JFrame {

    public Frame()
    {
        Toolkit tools = Toolkit.getDefaultToolkit();
        Dimension screen = tools.getScreenSize();

        setTitle("Zrzuter");
        setBounds(screen.width/2-(width/2), screen.height/2-(height/2), width, height);
        setResizable(false);

        Container content = getContentPane();
        content.add(new Panel());
    }

    private int width = 400;
    private int height = 100;
}

class Panel extends JPanel {

    public Panel()
    {
       // setLayout(new BorderLayout());

        text    = new JTextField(20);
        button  = new JButton("Pobierz");

        button.addActionListener(new Click());

        JPanel panel = new JPanel();
        panel.add(new Label("Url do utworu:"));
        panel.add(text);

        add(panel);
        add(button);
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;

        g2.drawString(asize+" / "+size, 5, 70);
    }

    private class Click implements ActionListener {

        public void actionPerformed(ActionEvent event)
        {
            String url = text.getText();
            url = url.replace("audio", "sr/f");

            try
            {
                URL urlw = new URL(url);
                URLConnection connect = urlw.openConnection();

                size = connect.getContentLength();
                String type = connect.getContentType();

                String[] names = url.split("/");
                String filename = names[names.length-1]+".mp3";

                // czytanie pliku
                InputStream in = urlw.openStream();

                // zapis do pliku na dysku
                FileOutputStream out = new FileOutputStream(filename, true);

                SizeThread sizeThread = new SizeThread();
                sizeThread.start();

                int x;
                byte data[] = new byte[1024];

                while((x = in.read(data,0,1024)) >= 0)
                {
                   asize += x;
                   out.write(data, 0, x);
                }
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
        }
    }

    private class SizeThread extends Thread {

        public void run()
        {
            while(asize < size)
                repaint();
        }
    }

    public int size,asize = 0;
    private JTextField text;
    private JButton button;
}
0

Pobieraj w osobnym wątku... przykład:

private class Click implements ActionListener {

        public void actionPerformed(ActionEvent event)
        {
            new Thread(new pobieraj()).start();
        }
    }

private class pobieraj implements Runnable {

        public void run() {
            String url = text.getText();
            url = url.replace("audio", "sr/f");
            try
            {
                URL urlw = new URL(url);
                URLConnection connect = urlw.openConnection();

                size = connect.getContentLength();
                String type = connect.getContentType();

                String[] names = url.split("/");
                String filename = names[names.length-1]+".mp3";

                // czytanie pliku
                InputStream in = urlw.openStream();

                // zapis do pliku na dysku
                FileOutputStream out = new FileOutputStream(filename, true);

                SizeThread sizeThread = new SizeThread();
                sizeThread.start();

                int x;
                byte data[] = new byte[1024];

                while((x = in.read(data,0,1024)) >= 0)
                {
                   asize += x;
                   out.write(data, 0, x);
                }
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
        }
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1