2011-12-15 1 views
-1

Я пытался решить следующую проблему в течение нескольких недель :(В моем Java-апплете (MyApplet) у меня есть метод для кнопки, называемый btnSendToPC, который должен отправлять выбранное содержимое файла с сервера на локальный ПК через открытый socket. Проблема возникает, когда я пытаюсь реализовать JProgressBar, который покажет пользователю, сколько из этого файла было загружено на локальный ПК. Я читал много примеров JProgressBar на этом сайте, но я, честно говоря, все еще не могу понять это. признателен, если вы помогли мне. Ниже очень короткая версия моего кода, включая все основные части.Java - Как обновить JProgressBar от Socket?

//My Network class that opens a socket and reads bytes from the socket 
public class TcpIp { 

    protected Socket s = null; 
    public DataInputStream dis = null; 

    public TcpIp(InetAddress ipa, int port) { 

     try { 
      s = new Socket(ipa.getHostAddress(), port); 
     } catch (IOException ex) { 
      System.out.println("Error opening socket!"); 
      return; 
     } 

     try { //Create an input stream. 
      dis = new DataInputStream(new BufferedInputStream(s.getInputStream())); 
     } catch (Exception ex) { 
      System.out.println("Error creating input stream!"); 
     } 

    } 

    public synchronized byte[] readBytes() throws IOException { 

     ByteArrayOutputStream getBytes = new ByteArrayOutputStream(); 

     int oneByte; 

     while ((oneByte = dis.read()) != 124) {//Reads 1 byte from the InputStream and breaks on | character 
      getBytes.write(oneByte); 
     } 

     return (getBytes.toByteArray()); 

    } 
} 

//My main Applet class that has the method for Send to PC button 
public class MyApplet extends javax.swing.JApplet implements Runnable { 

    public TcpIp gtp = null; 
    private static String inGet; 

    @Override 
    public void run() { 

     int i; 

     byte[] in = new byte[10000024]; 

     try { 
      Thread.sleep(1000); 
      //pause gtp.readBytes so that server has enough time to receive name of the file to read, 
      //to read its contents and send its contents back through socket 
     } catch (InterruptedException ex) { 
     } 

     if ((gtp != null)) { 

      try { 
       in = gtp.readBytes(); 
      } catch (IOException ex) { 
      } 

      //Remove non-printing bytes. 
      for (i = 0; i < in.length; i++) { 
       if (in[i] < 0x20) { 
        in[i] = 0x20; 
       } 
      } 

      inGet = new String(in); 
     } 
    } 

    public void btnSendToPC() { 

     //In here are commands that send name of the file to read. 
     //Server reads that file and sends its contents back through socket. 

     try { 

      FileOutputStream fout = new FileOutputStream(fn); 
      BufferedWriter myOutput = new BufferedWriter(new OutputStreamWriter(fout)); 

      timer = new Thread(this); 
      timer.start(); 

      try { 
       timer.join(); 
      } catch (InterruptedException ex) { 
      } 

      myOutput.write(inGet) 

      myOutput.close(); 
      fout.close(); 
     } 

    } 
} 
+1

Поддерживаемые необъяснимые понижения. Совершенно разумный вопрос. – EJP

ответ

3

Просто используйте javax.swing.ProgressMonitorInputStream. Все тяжело работает для вас.

+0

правильный ответ +1 – mKorbel

+0

Большое спасибо – jadrijan

+0

Thats new для меня. +1 – Stephan

3

Ваш класс TcpIp должен запускаться в своем потоке. Тогда вы звоните

SwingUtilities.invokeLater(new Runnable(){ 
    public void run(){ 
    progressBar.setValue(progressBar.getValue()+1); 
    } 
} 

после getBytes.write(oneByte);

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

Я бы также предложил не вызывать обновление progressbar для каждого полученного байта.

+0

Большое спасибо – jadrijan

1

Вы можете изменить панель прогресса с помощью oberver или eventlistener.

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

+0

Спасибо – jadrijan

 Смежные вопросы

  • Нет связанных вопросов^_^