给Swing程序添加一个动态显示内存情况的状态条

 

cpoy from http://yanhua.blog.techweb.com.cn/archives/2006/200691815392.shtml#cmt

在前面的文章中我们提到过Eclipse可以显示一个动态显示内存使用情况的状态条,而且还有一个按钮可以手工进行垃圾回收,昨天我看到OSWorkflow的设计器也有这么一个功能,那到底是怎么实现的呢?其实一点都不难,我们只要写一个特殊的JPanel就可以了!

 

class MemoryPanel extends JPanel   {    //状态条的颜色    private Color edgeColor = new Color(82, 115, 214);    private Color centerColor = new Color(180, 200, 230);

   public void paint(Graphics g)    {     super.paint(g);     //得到当前组件(JPanel)的大小     Dimension dimension = getSize();     //得到各边框的宽度     Insets insets = getInsets();     int left = insets.left;     int top = insets.top;          //得到内存使用状态信息     Runtime runtime = Runtime.getRuntime();     long freeMemory = runtime.freeMemory();     long totalMemory = runtime.totalMemory();          //组件(JPanel)除去左、右边框后的宽度     int insideWidth = dimension.width - (insets.left + insets.right);     //内存使用量的显示宽度     int usedAmount = insideWidth - (int) (((long) insideWidth * freeMemory) / totalMemory);     int insideHeight = dimension.height - (insets.bottom + insets.top);          Graphics2D g2 = (Graphics2D) g;     //设置渐变效果的画笔     g2.setPaint(new GradientPaint(left, top, edgeColor, left, insideHeight / 2, centerColor, true));     g.fillRect(left, top, usedAmount, insideHeight);     g.setColor(getBackground());     g.fillRect(left + usedAmount, top, insideWidth - usedAmount, insideHeight);     g.setFont(getFont());     g.setColor(Color.black);     //显示状态的文字     String memory = (Long.toString((totalMemory - freeMemory) / 1048576L) + "M of " + Long.toString(totalMemory / 1048576L) + 'M');     //确定文字的显示位置     FontMetrics fontmetrics = g.getFontMetrics();     int stringWidth = fontmetrics.charsWidth(memory.toCharArray(), 0, memory.length());     int stringHeight = fontmetrics.getHeight() - fontmetrics.getDescent();     //显示文字     g.drawString(memory, left + (insideWidth - stringWidth) / 2, top + (insideHeight + stringHeight) / 2);    }   }

有了这个JPanel,我们可以把它加到一个Frame或另一个Panel上去了。

  final MemoryPanel memoryPanel = new MemoryPanel();   memoryPanel.setPreferredSize(new Dimension(100, 15));   memoryPanel.setMaximumSize(new Dimension(100, 15));   memoryPanel.setMinimumSize(new Dimension(100, 15));   staPanel.add(memoryPanel,BorderLayout.EAST);

然后再启动一个计时器以便能让上面的JPanel实时更新。

Timer timer = new Timer(2000, new ActionListener()   {    public void actionPerformed(ActionEvent actionevent)    {     memoryPanel.repaint();    }   });   timer.start();

至于那个可以人工进行垃圾回收的小垃圾桶就更好做了,做一个带图标的JButton,在它的事件处理中进行垃圾回收并再调用一下上面那个JPanel的repaint()方法就可以了。

gcButton.addActionListener(new ActionListener(){

   public void actionPerformed(ActionEvent e)    {     System.gc();     memoryPanel.repaint();    }   });

是不是很简单呢?
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值