001 package com.valhalla.gui;
002
003 import javax.swing.*;
004 import javax.swing.event.*;
005 import java.awt.*;
006 import java.awt.event.*;
007
008 public class MemoryDialog extends JDialog
009 {
010 GridBagLayout grid = new GridBagLayout();
011 GridBagConstraints c = new GridBagConstraints();
012
013 JButton closeButton = new JButton( "Close" );
014 JButton gcButton = new JButton( "Garbage Collection" );
015 JLabel total = new JLabel("0k");
016 JLabel free = new JLabel("0k");
017 JLabel used = new JLabel("0k");
018 JPanel middle = new JPanel(grid);
019 static MemoryDialog instance = null;
020 javax.swing.Timer timer = new javax.swing.Timer(3000, new TimerListener());
021 Runtime rt = Runtime.getRuntime();
022 long totalk = 0;
023 long freek = 0;
024 long usedk = 0;
025 java.text.NumberFormat nf = java.text.NumberFormat.getInstance();
026
027
028 public static void main(String args[])
029 {
030 MemoryDialog.getInstance(null);
031 }
032
033 class TimerListener implements ActionListener
034 {
035 public void actionPerformed(ActionEvent e) {setMemory();}
036 }
037
038 public static MemoryDialog getInstance(JFrame parent)
039 {
040 if( instance == null ) instance = new MemoryDialog(parent);
041
042 return instance;
043 }
044
045 private MemoryDialog(JFrame parent)
046 {
047 super(parent, "Heap Statistics");
048
049 JPanel main = (JPanel)getContentPane();
050 main.setLayout(new BorderLayout());
051 main.setBorder(BorderFactory.createTitledBorder("Heap Statistics"));
052
053 middle.setBorder(BorderFactory.createEmptyBorder(5, 20, 5, 20));
054
055 c.gridx = 0;
056 c.gridy = -1;
057 c.weightx = .5;
058
059 addElement("Total Memory:", total);
060 addElement("Used Memory:", used);
061 addElement("Free Memory:", free);
062
063 c.weighty = 1;
064 c.gridwidth = 2;
065 c.gridy++;
066 JLabel blank = new JLabel();
067 grid.setConstraints(blank, c);
068 middle.add(blank);
069
070 main.add(middle, BorderLayout.CENTER);
071 JPanel buttons = new JPanel();
072 buttons.setLayout(new BoxLayout(buttons, BoxLayout.X_AXIS));
073 buttons.add(Box.createHorizontalGlue());
074 buttons.add(gcButton);
075 buttons.add(closeButton);
076 buttons.add(Box.createHorizontalGlue());
077 buttons.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
078 addWindowListener(new WindowAdapter()
079 {
080 public void windowClosed(WindowEvent e)
081 {
082 closeHandler();
083 }
084 });
085
086 closeButton.addActionListener(new ActionListener()
087 {
088 public void actionPerformed(ActionEvent e)
089 {
090 closeHandler();
091 }
092 });
093
094 gcButton.addActionListener(new ActionListener()
095 {
096 public void actionPerformed(ActionEvent e)
097 {
098 System.gc();
099 System.gc();
100 setMemory();
101 }
102 });
103
104 main.add(buttons, BorderLayout.SOUTH);
105 setMemory();
106 timer.start();
107 pack();
108 setSize(new Dimension(310,140));
109 setLocationRelativeTo(parent);
110 setVisible(true);
111 }
112
113 private void closeHandler()
114 {
115 timer.stop();
116 setVisible(false);
117 instance = null;
118 }
119
120 private void setMemory()
121 {
122 totalk = rt.totalMemory() / 1024;
123 freek = rt.freeMemory() / 1024;
124 usedk = totalk - freek;
125
126 this.total.setText(nf.format(totalk));
127 this.free.setText(nf.format(freek));
128 this.used.setText(nf.format(usedk));
129 }
130
131 private void addElement(String title, JLabel label)
132 {
133 c.gridx = 0;
134 c.gridy++;
135 c.weightx = .5;
136 c.anchor = GridBagConstraints.EAST;
137 JLabel t = new JLabel(title);
138 t.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 10));
139 grid.setConstraints(t, c);
140 middle.add(t);
141 c.gridx++;
142 grid.setConstraints(label,c);
143 middle.add(label);
144 c.weightx = 0;
145 c.gridx++;
146 JLabel k = new JLabel("k");
147 k.setBorder(BorderFactory.createEmptyBorder(0,0,0,20));
148 grid.setConstraints(k,c);
149 middle.add(k);
150 }
151 }