2011-05-09 60 views
2

我有一個帶有標籤文本的java應用程序,並顯示實際剩餘的硬盤空間。我創建了另一個類,一個「Runnable」,每X秒讀一次硬盤剩餘多少空間。監控硬盤空間......如何實時顯示信息?

現在我的問題:我該如何顯示JFrame中的「statatic」標籤,該信息?我認爲最接近的工作應該是在「可運行」類中創建一個函數,返回「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)

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"); 

} 

謝謝!


更新的代碼:

通過閱讀HERE,我做了這些變化:

在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"); 
     } 
    }); 
} 

我無法得到它的工作尚未=/

+0

你可以張貼一些代碼? – Kaj 2011-05-09 20:02:43

回答

4

你需要建立一個在後臺運行一個單獨的線程(如使用ScheduledExecutorService),定期收集您需要的信息,然後更新相關的揮杆組分(使用SwingUtilities.invokeLater())。

或者使用javax.swing.Timer(如Kaj在註釋中指出的那樣),這可能會爲您簡化一些操作。

+2

..或使用java.swing.Timer。它將在正確的線程上執行。 – Kaj 2011-05-09 20:17:29

+0

@Kaj - 漂亮。我不是一個真正的鬼傢伙,不知道搖擺計時器。 – jtahlborn 2011-05-09 20:35:38

+0

對代碼進行了更改,謝謝,但仍然無法正常工作=/ – punchi 2011-05-10 15:01:28

0

終於!!!感謝@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"); 
      } 
     }); 
    } 
    } 
}