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    }