📄 memorymanager.java
字号:
//----------------------------------
//MemoryManager.java
//
//Auther:Hu Dong
//-----------------------------------
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.event.*;
import javax.swing.border.*;
//main函数所在类
public class MemoryManager
{
public static void main(String[] args)
{
MemoryManagerFrame MMF=new MemoryManagerFrame();
MMF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
MMF.setVisible(true);
}
}
//窗体
class MemoryManagerFrame extends JFrame
{
public MemoryManagerFrame()
{
setTitle("RamManager");
setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
//add MMP to frame
MemoryManagerPane MMP=new MemoryManagerPane();
add(MMP);
}
public static final int DEFAULT_WIDTH=600;
public static final int DEFAULT_HEIGHT=580;
}
//面板
class MemoryManagerPane extends JPanel
{
public MemoryManagerPane()
{
JPanel p1=new JPanel();
JPanel p2=new JPanel();
p1.setLayout(new GridBagLayout());
p2.setLayout(new BorderLayout());
//border
Border etched=BorderFactory.createEtchedBorder();
Border title1=BorderFactory.createTitledBorder(etched,"操作");
Border title2=BorderFactory.createTitledBorder(etched,"状态");
p1.setBorder(title1);
p2.setBorder(title2);
//
s[0][0]=0;s[0][1]=0;s[0][2]=512;s[0][3]=1;//1表示该内存可用
//
final JTable table=new JTable(s,colmenu);
JScrollPane t = new JScrollPane(table);
//Button Action one
btn1.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
int i=0;
if(tf1.getText().equals("")) //判断用户是否输入数据
{
int confirm=JOptionPane.showConfirmDialog(null,"输入有误!","错误信息",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.WARNING_MESSAGE);
if(confirm==JOptionPane.CANCEL_OPTION)
System.exit(0);
}
int r=Integer.parseInt(tf1.getText().trim());
for(i=0;i<30;i++) //i指示table中的最后一行
{
if(s[i][3]==1) break;
}
if(r<=s[i][2]) //内存足够时进行分配
{
s[i+1][0]=s[i][0]+1;
s[i+1][1]=s[i][1]+r;
s[i+1][2]=s[i][2]-r;
s[i+1][3]=1;
s[i][2]=r;
s[i][3]=0;
}
else //内存不足,报错
{
int confirm=JOptionPane.showConfirmDialog(null,"内存不够!","错误信息",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.WARNING_MESSAGE);
if(confirm==JOptionPane.CANCEL_OPTION)
System.exit(0);
}
table.updateUI();
}
}
);
//Buton Action two
btn2.addActionListener(
new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
int i=0;
if(tf2.getText().equals("")) //判断用户是否输入数据
{
int confirm=JOptionPane.showConfirmDialog(null,"输入有误!","错误信息",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.WARNING_MESSAGE);
if(confirm==JOptionPane.CANCEL_OPTION)
System.exit(0);
}
int id=Integer.parseInt(tf2.getText());
for(i=0;i<30;i++)//i指示table中的最后一行
{
if(s[i][3]==1) break;
}
if(i==0) //没有内存分配
{
int confirm=JOptionPane.showConfirmDialog(null,"该内存没有分配!","错误信息",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.WARNING_MESSAGE);
if(confirm==JOptionPane.CANCEL_OPTION)
System.exit(0);
}
else
{
if(id==0) //当释放第一块内存区域时
{
if(i==1) //当只有第一块内存分配时
{
s[0][0]=0;s[0][1]=0;s[0][2]=512;s[0][3]=1;
//置i行属性值为null
s[i][0]=null;s[i][1]=null;s[i][2]=null;s[i][3]=null;
}
else
{
int sum=0;//计算s[][2]
s[0][3]=s[1][3];
for(int j=1;j<(i-1);j++)
{
sum+=s[j][2];
s[j][1]=sum;
s[j][2]=s[j+1][2];
}
s[i-1][1]=sum+s[i-1][2];
s[i-1][2]=512-s[i-1][1];
s[i-1][3]=1;
s[i][0]=null;s[i][1]=null;s[i][2]=null;s[i][3]=null;
}
}
else if(id<i) //当释放中间内存区域时
{
for(int j=id;j<i;j++)
{
if(j==(i-1)) //当j到达i的下一行时,需要单独考虑
{
s[j][2]=512-s[j][1];
s[j][3]=1;
}
else
{
s[j][2]=s[j+1][2];
s[j+1][1]=s[j][1]+s[j][2];
}
}
s[i][0]=null;s[i][1]=null;s[i][2]=null;s[i][3]=null;
}
else
{
int confirm=JOptionPane.showConfirmDialog(null,"该内存未分配!","错误信息",
JOptionPane.OK_CANCEL_OPTION,
JOptionPane.WARNING_MESSAGE);
if(confirm==JOptionPane.CANCEL_OPTION)
System.exit(0);
}
}
table.updateUI();
}
}
);
//add components into panel1
p1.add(a1, new GBC(0,0));
p1.add(a2,new GBC(0,1));
p1.add(tf1, new GBC(1,0));
p1.add(tf2, new GBC(1,1));
p1.add(a3, new GBC(2,0));
p1.add(btn1, new GBC(3,0));
p1.add(btn2, new GBC(3,1));
//add components into panel2
p2.add(t, BorderLayout.CENTER);
//JFrame中添加两个Panel
add(p1);
add(p2);
}
private JLabel a1=new JLabel("要申请的内存大小");
private JLabel a2=new JLabel("要结束的内存ID");
private JLabel a3=new JLabel("MBytes 0~512");
private JTextField tf1=new JTextField(10);
private JTextField tf2=new JTextField(10);
private JButton btn1=new JButton("分配");
private JButton btn2=new JButton("释放");
private Integer[][] s=new Integer[30][4];
private String[] colmenu={"ID","起始地址","块大小","块状态"};
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -