Мониторинг пространства HDD ... как показать информацию в режиме реального времени? - PullRequest
2 голосов
/ 09 мая 2011

У меня есть приложение Java с текстом метки и показывает фактическое оставшееся место на жестком диске. Я создал другой класс, «Runnable», который каждые X секунд читает, сколько места осталось на жестком диске.

Теперь моя проблема: как я могу показать на «статическом» ярлыке в JFrame эту информацию? Самое близкое, что я подумал, должно сработать, это создать функцию в классе «runneable», возвращающую «двойное» число, и создать экземпляр этого класса в JFrame, но похоже, что JFrame запускается только однажды в этой строке, и обновления нет в коде.

Как я могу контролировать это? Я тоже хочу отслеживать другие переменные, но это начало.


Код: для чтения места на жестком диске

package gwcontrol;
import java.io.File;

public class Analisis implements Runnable{

long delay;
File file = new File("C:\\"); 
float FreeSpace;
float TotalSpace;

public Analisis(long delay){
    this.delay = delay;
    //setDaemon(true);
}

public void run(){

    try {
        while (true) {
        this.FreeSpace = (float) file.getFreeSpace() / 1024 / 1024 / 1024;
        System.out.println("Espacio libre: " + this.FreeSpace);
        Thread.sleep(this.delay);
        }

    } catch (InterruptedException e) {
        //System.out.println("Error" + e);
    }
}

public float getFreeSpace(){
    return this.FreeSpace;
}

public float getTotalSpace(){
    return this.TotalSpace;
}

}

Код: GUI (не весь код, только необходимый IMO)

public class ControlGUI extends javax.swing.JFrame {

/** Creates new form ControlGUI */

public Analisis analisis = new Analisis(1000);

public ControlGUI() {

    try{
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }catch (Exception e){
    System.err.println( e );
    }

    new Thread(analisis).start();

    File file = new File("C:\\"); 

    float FreeSpace = (float) file.getFreeSpace() / 1024 / 1024 / 1024;
    float TotalSpace = (float) file.getTotalSpace() / 1024 / 1024 / 1024;  
    float UsedSpace = TotalSpace - FreeSpace;  

    setTitle("GWControl - A+V - v.1.0");
    initComponents();

    jProgressBar1.setMaximum((int)TotalSpace);
    jProgressBar1.setMinimum(0);
    jProgressBar1.setValue((int)UsedSpace);

    lbl_espacio_libre.setText("HDD: " + analisis.getFreeSpace() + " Mb libres");
    lbl_porcentaje_espacio.setText(UsedSpace*100/TotalSpace + "% del disco utilizado");

}

Спасибо !!


Обновленный код:

Читая ЗДЕСЬ , я внес эти изменения:

в ControlGUI.java:

public static void main(String args[]) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            ControlGUI control = new ControlGUI();
            control.setVisible(true);
        }
    });
}

и Внутри конструктора:

this.updateProgress(analisis.getFreeSpace());

[...]

private void updateProgress(final double numero) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
          lbl_espacio_libre.setText("HDD: " + numero + " Mb libres");
        }
    });
}

Я пока не могу заставить его работать = /

Ответы [ 2 ]

4 голосов
/ 10 мая 2011

вам нужно создать отдельный поток, который будет работать в фоновом режиме (например, используя ScheduledExecutorService), периодически собирать необходимую информацию и затем обновлять соответствующие компоненты свинга (используя SwingUtilities.invokeLater()).

или используйте javax.swing.Timer (как отметил Кадж в комментариях), что, вероятно, упростит вам часть этого.

0 голосов
/ 10 мая 2011

Наконец !!! спасибо @jtahlborn за библиотеку / функцию

public class ControlGUI extends javax.swing.JFrame {

pruebas prueba;

public ControlGUI() {

    try{
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }catch (Exception e){
    System.err.println( e );
    }

    final File file = new File("C:\\"); 

    float FreeSpace = (float) file.getFreeSpace() / 1024 / 1024 / 1024;
    float TotalSpace = (float) file.getTotalSpace() / 1024 / 1024 / 1024;  
    float UsedSpace = TotalSpace - FreeSpace;  

    setTitle("GWControl - A+V - v.1.0");

    initComponents();

    jProgressBar1.setMaximum((int)TotalSpace);
    jProgressBar1.setMinimum(0);
    jProgressBar1.setValue((int)UsedSpace);

    prueba = new pruebas(lbl_espacio_libre);
    prueba.start();

    lbl_porcentaje_espacio.setText(UsedSpace*100/TotalSpace + "% del disco utilizado");
}

и

package gwcontrol;
import java.io.File;
import javax.swing.SwingUtilities;

public class pruebas extends Thread implements Runnable {

float FreeSpace;
File file;
javax.swing.JLabel label;

public pruebas(javax.swing.JLabel label){

    this.label = label;
    file = new File("C:\\"); 
}

 public void run() {
    while (true) {

        try {
            this.FreeSpace = (float) file.getFreeSpace() / 1024 / 1024 / 1024;
            System.out.println("Espacio libre: " + this.FreeSpace);
            Thread.sleep(1000);
        } catch (Exception e) {
            System.out.println("Problema: " + e);
        }

        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
              label.setText("HDD: " + FreeSpace + " Mb libres");
            }
        });
    }
  }
}
...