简体   繁体   English

ProgressMonitor和SwingWorker无法正常工作

[英]ProgressMonitor and SwingWorker aren't working

I've got a problem with a SwingWorker. 我在使用SwingWorker时遇到问题。 The application sends a file between client and server but the progressmonitor will not be shown me progress during transmission. 该应用程序在客户端和服务器之间发送文件,但是在传输过程中不会向进度监视器显示进度。 Could you tell me what i'm doing wrong and what should i do? 你能告诉我我做错了什么,我应该怎么做?

The main class is the same for both applications: 这两个应用程序的主类相同:

package main;

import java.awt.EventQueue;

public class Main {

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {

                Test2 test2=new Test2();

            }
        });

    }

}

Client: 客户:

package main;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

public class Test2 {

    public Test2() {

        hostName="localhost";

        try {
            clientSocket = new Socket(hostName, 1234);
        } catch (UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        File file=new File("E:/test/123.mp4");

        try {
            fileInputStream=new FileInputStream(file);
            bis=new BufferedInputStream(fileInputStream);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        try {
            bos=new BufferedOutputStream(clientSocket.getOutputStream());
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 

        bit=new byte[512];
        int len;

        System.out.println("Send..."); //test

        try {
            while ((len = bis.read(bit,0,511)) != -1) {
                bos.write(bit, 0, len);
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       

        try {
            bis.close();
            bos.close();
            fileInputStream.close();
            //fileOutputStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }   

        System.out.println("Finish"); //test

    }

    private String hostName;
    private Socket clientSocket;

    private BufferedInputStream bis;
    private BufferedOutputStream bos;
    private FileInputStream fileInputStream;
    private byte bit[];
}

Server: 服务器:

package main;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;

import javax.swing.ProgressMonitor;
import javax.swing.SwingWorker;

public class Test2 {

    public Test2() {

        pm=new ProgressMonitor(null, "Download...", null, 0, 1850297);
        pm.setMillisToDecideToPopup(1);

        test4=new Test4();
        test4.execute();                            

    }

    private class Test4 extends SwingWorker<Boolean, Void> {

        public Test4() {

            try {
                welcomeSocket = new ServerSocket(1234);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            System.out.println("Server works");

            try {
                connectionSocket = welcomeSocket.accept();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

        @Override
        protected Boolean doInBackground() throws Exception {

            try {

                bis=new BufferedInputStream(connectionSocket.getInputStream());

            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            try {
                fileOutputStream=new FileOutputStream("E:/test2/123.mp4");
                bos=new BufferedOutputStream(fileOutputStream);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }                                           

            bit=new byte[512];
            int len;

            System.out.println("Download..."); //test

            try {
                while ((len = bis.read(bit,0,511)) != -1) {

                    bos.write(bit, 0, len);

                    publish();

                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            try {
                bis.close();
                bos.close();
                fileOutputStream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }           

        return true;

        }

        @Override
        protected void process(List<Void> chunks) {

            number++;
            pm.setProgress(number);

        }

        @Override
        protected void done() {
            System.out.println("DONE");
        }

    }

    private ServerSocket welcomeSocket; 
    private Socket connectionSocket;

    private FileOutputStream fileOutputStream;
    private BufferedInputStream bis;
    private BufferedOutputStream bos;
    private byte bit[];

    private ProgressMonitor pm;
    private Test4 test4;
    private int number;

}

Apart from SwingWorker, I've got a problem with a code below. 除了SwingWorker,我的下面的代码还有问题。 This is second version my server's application without a SwingWorker. 这是没有SwingWorker的服务器应用程序的第二个版本。 Here, the progressmonitor is shown me progress during transmission, but not ever. 在这里,进度监视器显示了传输过程中的进度,但从未显示。 I used invokeLater in run() method but sometimes the progressmonitor isn't work. 我在run()方法中使用了invokeLater,但有时ProgressMonitor无法正常工作。 Could you tell me what i'm doing wrong? 你能告诉我我在做什么错吗?

Server: 服务器:

package main;

import java.awt.EventQueue;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;

import javax.swing.ProgressMonitor;
import javax.swing.SwingWorker;

public class Test2 {

    public Test2() {

        pm=new ProgressMonitor(null, "Download...", null, 0, 1850297);
        pm.setMillisToDecideToPopup(1);

        test3=new Test3();
        new Thread(test3).start();                          

    }

    private class Test3 implements Runnable {

        public Test3() {        

        }

        @Override
        public void run() {

            try {
                welcomeSocket = new ServerSocket(1234);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            System.out.println("Server works"); //test

            while(true){

                try {
                    connectionSocket = welcomeSocket.accept();

                    try {

                        bis=new BufferedInputStream(connectionSocket.getInputStream());

                    } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    try {
                        fileOutputStream=new FileOutputStream("E:/test2/123.mp4");
                        bos=new BufferedOutputStream(fileOutputStream);
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }                                   

                    bit=new byte[512];
                    int len;

                    System.out.println("Download..."); //test

                    try {
                        while ((len = bis.read(bit,0,511)) != -1) {

                            bos.write(bit, 0, len);

                            EventQueue.invokeLater(new Runnable() {

                                @Override
                                public void run() {
                                    number++;
                                    pm.setProgress(number);

                                }
                            });

                        }
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }                           

                    try {
                        bis.close();
                        bos.close();
                        fileOutputStream.close();
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                    System.out.println("DONE"); //test

                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

        }

    }

    private ServerSocket welcomeSocket; 
    private Socket connectionSocket;

    private FileOutputStream fileOutputStream;
    private BufferedInputStream bis;
    private BufferedOutputStream bos;
    private byte bit[];

    private ProgressMonitor pm;
    private Test3 test3;
    private int number;

}

You're waiting on the socket connection and accepting it in the Test4 constructor which will be called on the Swing event thread . 您正在等待套接字连接,并在将在Swing事件线程上调用的Test4构造函数中接受它。 It's OK to create the socket there, but don't wait for the connection there as this blocks. 可以在此处创建套接字,但是不要等待在那里的连接,因为这会阻塞。 Instead wait for the connection it in the doInBackground method. 而是在doInBackground方法中等待连接。

Also consider changing your SwingWorker so it passes the bytes read: 还可以考虑更改您的SwingWorker,使其传递读取的字节:

// change generic parameter to Integer
private class Test4 extends SwingWorker<Boolean, Integer> {


    @Override
    protected Boolean doInBackground() throws Exception {

        // .....                                          

        bit=new byte[512];
        int len;

        try {
            while ((len = bis.read(bit,0,511)) != -1) {

                bos.write(bit, 0, len);

                publish(len);

            }

and elsewhere: 和其他地方:

    @Override
    protected void process(List<Integer> chunks) {
        // number++;
        for (Integer chunk : chunks) {
           pm.setProgress(chunk);
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM