⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drowmemorychangepanel.java

📁 java内存分配演示程序
💻 JAVA
字号:
package com.ysu.cwy;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JPanel;

public class DrowMemoryChangePanel extends JPanel {

	private static final long serialVersionUID = 1L;    
	List<MemoryBlock> memoryFreeBlockList = null;     //内存空闲链表
	List<MemoryBlock> memoryBlockInUseList = null;    //内存使用链表
	MemoryInit memoryInit = null;                     //内存初始化对象
	
	//构造函数
	public DrowMemoryChangePanel(List<MemoryBlock> memoryFreeBlockList,
			List<MemoryBlock> memoryBlockInUseList, MemoryInit memoryInit) {
		super();
		this.memoryFreeBlockList = memoryFreeBlockList;
		this.memoryBlockInUseList = memoryBlockInUseList;
		this.memoryInit = memoryInit;
	}//end method DrowMemoryChangePanel

	/**
	 * @function 进行画内存状态
	 */
	@Override
	protected void paintComponent(Graphics g) {
		Rect rect1 = new Rect(160, 80, 60, 20);
		Rect rect2 = new Rect(160, 140, 60, 20);
		Rect rect3 = new Rect(160, 220, 60, 20);
		CalculateRect cr = new CalculateRect(memoryInit, 650);
		List<MemoryBlock> list = allBlockInOrder();
		for (int i = 0; i < list.size(); i++) {
			MemoryBlock memoryBlock = list.get(i);
			Rect rect = cr.calculateRect(memoryBlock);
			if (memoryBlock.getBlockStatus()) {
				DrawUsedFillRect(rect, g);
				int x = rect.getX() + rect.getWidth() / 2 - rect.getWidth() / 4;
				int y = rect.getY() + rect.getHighth() / 2 + 7;
				g.setColor(Color.black);
				Font font = new Font("Monospaced", Font.PLAIN, 14);
				g.setFont(font);
				g.drawString(String.valueOf(memoryBlock.getProcessId()) + "("
						+ String.valueOf(memoryBlock.getBlockSize()) + ")", x,
						y);
			} else {
				DrawFreeFillRect(rect, g);
			}
			myDrawRect(rect, g, memoryBlock);
		}
		Font font = new Font("Monospaced", Font.PLAIN, 12);
		g.setFont(font);
		DrawFreeFillRect(rect2, g);
		g.drawString("未使用的内存", rect2.getX() - 4, rect2.getY()
				+ rect2.getHighth() + 14);
		g.setColor(Color.green);
		DrawUsedFillRect(rect1, g);
		g.drawString("被使用的内存", rect1.getX() - 4, rect1.getY()
				+ rect1.getHighth() + 14);
		g.setColor(Color.black);
		g.drawString("XXXX(XXXX)", rect3.getX(), rect3.getY());
		DrawLine(rect3.getX(), rect3.getY() + 2, 20, g, "进程号");
		DrawLine(rect3.getX() + 30, rect3.getY() + 2, 40, g, "占用内存");
	}//end method paintComponent
	
    /**
     * @function 画矩形的边框
     * @param rect 矩形 
     * @param g Graphics对象  
     * @param block 矩形所代表的内存块
     */
	public void myDrawRect(Rect rect, Graphics g, MemoryBlock block) {
		Font font = new Font("Monospaced", Font.PLAIN, 11);
		g.setColor(Color.BLUE);
		g.setFont(font);
		g.drawRect(rect.getX(), rect.getY(), rect.getWidth(), rect.getHighth());
		g.drawString(String.valueOf(block.getBlockStartPlace()), rect.getX()
				+ rect.getWidth() + 4, rect.getY() + 7);
		g.drawString(String.valueOf(block.getBlockEndPlace()), rect.getX()
				+ rect.getWidth() + 4, rect.getY() + rect.getHighth());
	}//end method myDrawRect

	/**
	 * @function 画被使用内存块的矩形
	 * @param rect  要画的矩形
	 * @param g Graphics对象
	 */
	public void DrawUsedFillRect(Rect rect, Graphics g) {
		g.setColor(Color.green);
		g.fillRect(rect.getX(), rect.getY(), rect.getWidth(), rect.getHighth());
	}//end method DrawUsedFillRect

	/**
	 * @function 画没有使用内存块的矩形
	 * @param rect  要画的矩形
	 * @param g Graphics对象
	 */
	public void DrawFreeFillRect(Rect rect, Graphics g) {
		g.setColor(Color.red);
		g.fillRect(rect.getX(), rect.getY(), rect.getWidth(), rect.getHighth());
	}//end method DrawFreeFillRect

	/**
	 * @function 对空闲链表和使用链表中的内存块按地址递增排序
	 * @return  排好序的链表
	 */
	public List<MemoryBlock> allBlockInOrder() {
		int blockSize = 0;
		int startPlace = 0;
		int allBlockSize = memoryFreeBlockList.size()
				+ memoryBlockInUseList.size();
		MemoryBlock block = null;
		List<MemoryBlock> list = new ArrayList<MemoryBlock>();
		while (true) {
			for (int i = 0; i < memoryFreeBlockList.size(); i++) {
				block = memoryFreeBlockList.get(i);
				if (block.getBlockStartPlace() == startPlace) {
					list.add(block);
					startPlace = block.getBlockEndPlace() + 1;
					blockSize++;
					break;
				}
			}

			for (int i = 0; i < memoryBlockInUseList.size(); i++) {
				block = memoryBlockInUseList.get(i);
				if (block.getBlockStartPlace() == startPlace) {
					list.add(block);
					startPlace = block.getBlockEndPlace() + 1;
					blockSize++;
					break;
				}
			}
			if (blockSize == allBlockSize) {
				break;
			}
		}
		return list;
	}//end method allBlockInOrder
    
	/**
     * @function 画丁字形图画并显示字符串
     * @param x  左上角x坐标
     * @param y  左上角y坐标
     * @param dy y轴增量
     * @param g Graphics对象
     * @param str 要显示的字符串
     */
	public void DrawLine(int x, int y, int dy, Graphics g, String str) {
		g.setColor(Color.black);
		g.drawLine(x, y, x + 22, y);
		g.drawLine(x + 11, y, x + 11, y + dy);
		g.drawString(str, x - 10, y + dy + 12);
	}//end method DrawLine
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -