Java 监视硬盘空间。。。如何实时显示信息?

Java 监视硬盘空间。。。如何实时显示信息?,java,monitoring,Java,Monitoring,我有一个带有标签文本的java应用程序,它显示了实际剩余的硬盘空间。我创建了另一个类,一个“可运行”类,它每X秒读取硬盘上剩余的空间 现在我的问题是:如何在JFrame中的“static”标签中显示该信息?我认为最有效的方法是在“runneable”类中创建一个返回“double”数字的函数,并在JFrame中实例化该类,但看起来JFrame只运行一次该行,代码中没有更新 我如何监控这个?我也想监控其他变量,但这是最重要的 代码:读取硬盘空间 package gwcontrol; import

我有一个带有标签文本的java应用程序,它显示了实际剩余的硬盘空间。我创建了另一个类,一个“可运行”类,它每X秒读取硬盘上剩余的空间

现在我的问题是:如何在JFrame中的“static”标签中显示该信息?我认为最有效的方法是在“runneable”类中创建一个返回“double”数字的函数,并在
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)

谢谢


更新代码:

通过阅读,我做了以下改变:

在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());
[……]


我还不能让它工作=/

您需要创建一个在后台运行的单独线程(例如,使用
ScheduledExecutorService
),定期收集您需要的信息,然后更新相关的swing组件(使用
SwingUtilities.invokeLater()


或者使用javax.swing.Timer(正如Kaj在评论中指出的),这可能会为您简化一些操作。

最后!!!感谢@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");
}


.. 或者使用java.swing.Timer。它将在正确的线程上执行。@Kaj-nifty。我不是一个真正的gui爱好者,不知道swing Timer。对代码进行了更改,谢谢,但还不能开始工作=/@Kaj,关于swing Timer,如果您必须访问网络驱动器,您可能不需要它,任何可能阻塞(或可能有故障介质,如CD/DVD/flash)的IO最好在单独的线程中运行。@bestsss。谁说count total disk space类没有在另一个线程中运行,然后总是通过一个方法公开最后的计算结果?;)
private void updateProgress(final double numero) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
          lbl_espacio_libre.setText("HDD: " + numero + " Mb libres");
        }
    });
}
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");
            }
        });
    }
  }
}