Почему мой кадр зависает, когда я запускаю это действие [СКАЧАТЬ]

1

Я сделал рамку с кнопкой "Начать загрузку", чтобы загрузить JAR с веб-сайта.

Проблема в том, что всякий раз, когда я нажимаю кнопку запуска загрузки, весь кадр замерзает до тех пор, пока он не будет загружен, а затем он станет нормальным после этого.

Как я могу это исправить?

Здесь код, когда кнопка нажата, выполняется

 private void addToDesktop() throws IOException {

    URL url = new URL("urlremoved");
    URLConnection connection = url.openConnection();
    InputStream inputstream = connection.getInputStream();
    FileSystemView filesys = FileSystemView.getFileSystemView();
    filesys.getHomeDirectory();
    sizeOfClient = connection.getContentLength();
    BufferedOutputStream bufferedoutputstream = new BufferedOutputStream(new FileOutputStream(new File(clientDL.textField1.getText() + "/jarname.jar")));
    byte[] buffer = new byte[2048];
    int length;


    while(( length = inputstream.read(buffer)) > -1)
    {
        down += length;
        bufferedoutputstream.write(buffer, 0 , length);
         String text = clientDL.label1.getText();
        int perc = getPerc();

        if(perc <= 50)
        {
            text +=  getPerc() + "% done";
        }else
        {
            text ="Please wait until the jar is downloading...";
            text = text + (100 - perc) + " % remaining";
        }
    }

    if (down == sizeOfClient) {
        JOptionPane.showMessageDialog(clientDL.frame, "Download successful. It has been placed at : " + clientDL.textField1.getText() + "/jarname.jar", "Success!", JOptionPane.INFORMATION_MESSAGE);
        clientDL.frame.dispose();
        clientDL.frame.setVisible(false);

    }
    bufferedoutputstream.flush();
    bufferedoutputstream.close();
    inputstream.close();
    hideSplashScreen();
}
Теги:
jframe
actionlistener

2 ответа

2

Короткий ответ: вам нужно запустить его в отдельном потоке, если вы не хотите его замораживать.

Существует много способов реализации этого. Почти все требует, чтобы вы извлекли метод addToDestop() в класс runnable. Этот класс может расширить Thread или SwingWorker или что-нибудь в этом роде.

Вы можете проверить следующую ссылку для SwingWorker.

http://www.oracle.com/technetwork/articles/javase/swingworker-137249.html

После псевдокода вы получите представление.

public class Downloader extends SwingWorker<VOID, VOID> {
    private String url;

    public Downloader(String url){
        this.url = url;
    }

    private void addToDesktop(){
        //your code
    }

    @override
    protected void doInBackground(){
        addToDesktop();
    }

    @override
    protected void done(){
        //success
    }
}
  • 0
    Привет Харун, спасибо за краткий ответ, как я буду продолжать делать это? я все еще новичок: спасибо!
  • 0
    спасибо также за вашу помощь!
0

попробуйте использовать Threads, это остановит замораживание вашего кадра

private Thread thread;

,

thread = new Thread(new Runnable(){
public void run(){
//Your code here
}
});
thread.start();
  • 0
    Спасибо! работал отлично :) я просто должен был поймать IOException, а не бросать его.
  • 0
    -1. Не обновляйте свой графический интерфейс за пределами EDT. И вы не положили этот отказ от ответственности.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню