2013-12-13 5 views
1

Я не новичок, но и проф. на Java. Я пытаюсь добавить progressBar в мое приложение, которое отправляет pings в указанный диапазон ip с помощью метода isReachable(). Как я могу добавить? Я не знаю, задачи и темы использования. Я читал java-документы о progressBar, но я не мог добавить. Вот мой кодКак добавить индикатор прогресса на время? Java

final JButton btnScan = new JButton("Scan"); 
btnScan.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent arg0) { 
     Runtime rt = Runtime.getRuntime(); 
     String lastIpCheck = " "; 
     String ip = textField.getText(); 
     String lastIp = textField_1.getText(); 
     String parsedOutput= " "; 
     InetAddress inet; 
     boolean reachable; 

     while(!(lastIpCheck.equalsIgnoreCase(lastIp))) { 
      try { 
       inet = InetAddress.getByName(ip); 
       reachable = inet.isReachable(2500); 
       String output=null; 
       lastIpCheck = f.nextIpAddress(ip); 

       if(reachable) { 
        model.addElement(ip); 
       } 

       ip = lastIpCheck; 

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

Я хочу добавить ProgressBar к для сканирования операции, While Loop делает opearation сканирования пинга.

Пожалуйста, помогите мне. Спасибо. Прошу прощения за плохой язык

+0

«Я не знаю задачи и использования потоков» прочитал [книгу] (http://jcip.net/), [tutorial] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/), больше [javadocs] (http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html). SO - это неправильное место, чтобы узнать все это в пределах одного вопроса. – zapl

+0

Спасибо за предложение, у меня есть домашнее задание завтра. Спасибо за совет. Я буду читать. Мне нужно предложение, как это сделать. – cantas

+0

http://docs.oracle.com/javase/7/docs/api/javax/swing/JProgressBar.html#setValue(int), как насчет этого вы не понимаете? – Cruncher

ответ

5

Что я могу видеть о вашем сообщении, вы пытаетесь сохранить отзывчивость пользовательского интерфейса при попытке выполнить долговременную задачу в Swing.

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

Начиная с Java 1.6 Swing SDK включает класс SwingWorker, который позволяет выполнять такие задачи в другом потоке, обеспечивая при этом привязку к потоку пользовательского интерфейса, чтобы пользователь обновлял информацию о том, как идет процесс.

Основной пример приведен в учебнике по Java.

SwingWorker worker = new SwingWorker<ImageIcon[], Void>() { 
@Override 
public ImageIcon[] doInBackground() { 
    final ImageIcon[] innerImgs = new ImageIcon[nimgs]; 
    for (int i = 0; i < nimgs; i++) { 
     innerImgs[i] = loadImage(i+1); 
    } 
    return innerImgs; 
} 

@Override 
public void done() { 
    //Remove the "Loading images" label. 
    animator.removeAll(); 
    loopslot = -1; 
    try { 
     imgs = get(); 
    } catch (InterruptedException ignore) {} 
    catch (java.util.concurrent.ExecutionException e) { 
     String why = null; 
     Throwable cause = e.getCause(); 
     if (cause != null) { 
      why = cause.getMessage(); 
     } else { 
      why = e.getMessage(); 
     } 
     System.err.println("Error retrieving file: " + why); 
    } 
} 

};

В принципе вы можете определить свой собственный SwingWorker выполнить запрос Ping в doInBackgroundMethod и постоянно обновлять пользовательский интерфейс с методом GET()

Вот ссылка на учебник Java: http://docs.oracle.com/javase/tutorial/uiswing/concurrency/simple.html

В В Википедии есть подробное объяснение того, как использовать SwingWorker: http://en.wikipedia.org/wiki/SwingWorker

Надеюсь, это поможет вам решить вашу проблему.

С наилучшими пожеланиями.

+0

Спасибо вам @ Kuraokami. Это действительно полезно. – cantas

+0

Можете ли вы мне помочь? Я не могу этого сделать. Можете ли вы описать, как сделать более понятным, пожалуйста? – cantas