package tk.amberide.ide.swing.misc; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JProgressBar; import javax.swing.SwingUtilities; public class MemoryMonitorProgressBar extends JProgressBar { protected int sleepTime; public MemoryMonitorProgressBar() { sleepTime = 1000 * 10; setStringPainted(true); Thread memoryThread = new Thread(new Runnable() { public void run() { while (true) { update(); try { Thread.sleep(MemoryMonitorProgressBar.this.sleepTime); } catch (InterruptedException e) { } } } }); memoryThread.setDaemon(true); memoryThread.setPriority(1); memoryThread.start(); this.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent evt) { if (SwingUtilities.isLeftMouseButton(evt)) { Runtime.getRuntime().gc(); update(); } } }); } protected void update() { int used = (int) ((Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1024 / 1024); int total = (int) (Runtime.getRuntime().totalMemory() / 1024 / 1024); final String unit; if (used >= 1000 || total >= 1000) { used /= 1024; total /= 1024; unit = "GB"; } else unit = "MB"; final int used_ = used; final int total_ = total; SwingUtilities.invokeLater(new Runnable() { @Override public void run() { setMaximum(total_); setValue(used_); setString(used_ + " " + unit + "/" + total_ + " " + unit); } }); } public void setSleepTime(int sleepTime) { this.sleepTime = sleepTime; } }