每个button的事件监听都点一次运行好几次不知道为什么,为了验证是否事件监听里的代码会运行好几次,我在里面写了一个控制台的输出语句结果点了一次按钮语句输出了好几次,最关键的地方在butFeiPeiS,只要把他的事件监听代码修复了就没什么大问题了,要不会出错,谢谢指导!!!!由于不常上csdn所以分数不多了,请体谅谢谢!import java.awt.*;
import java.util.*;
import java.awt.event.*;public class bank extends Frame implements ActionListener
{
private static final long serialVersionUID = 1L;
private Dialog dialogUnsafe=new Dialog(this,"系统不安全!");
private Button butS=new Button("确定");
private Button butMax=new Button("确定");
private Button butSetName=new Button("确定");
private Button butAllocation=new Button("确定");
private Button butChange=new Button("修改资源");
private Button butChangeS=new Button("确定");
private Button butFenPei=new Button("分配资源");
private Button butFenPeiS=new Button("确定");
private Button butEsc=new Button("确定");
private TextField getProNum=new TextField(3);
private TextField getResNum=new TextField(3);
private Hashtable<String,TextField> map=new Hashtable<String,TextField>();
private Hashtable<String,Label> mapt=new Hashtable<String,Label>();
private int Max[][]=new int [100][100];//各进程所需各类资源的最大需求
private int Available[]=new int [100];//系统可用资源
private String name[]=new String [100];//资源的名称
private int Allocation[][]=new int [100][100];//系统已分配资源
private int Need[][]=new int [100][100];//还需要资源
private int temp[]=new int [100];//存放安全序列
private int Work[]=new int [100];//存放系统可提供资源
private int pNum;//用于存放进程数
private int rNum;//用于存放资源数

public static void main(String args[])
{
new bank();
}

bank()
{
super("银行家算法");
init();
}
public void init()
{
setBackground(new Color(255,228,196));
Panel top=new Panel();

Panel panel1=new Panel();
Panel panel2=new Panel();
Panel panel3=new Panel();

Label label1=new Label("请输入进程数:");
Label label2=new Label("请输入所需资源种类的数目:");

top.setLayout(new FlowLayout());
panel1.add(label1);
panel1.add(getProNum);
panel2.add(label2);
panel2.add(getResNum);
panel3.add(butS);
butS.addActionListener(this);
add(top);
top.add(panel1);
top.add(panel2);
top.add(panel3);
setSize(250,200);
setVisible(true);
addWindowListener(new WindowCloser());
}
private class WindowCloser extends WindowAdapter
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
}

public void setRName()
{
removeAll();
Panel panel1=new Panel();
add(panel1);
Label labelName=new Label("请依次输入各类资源的名称及其可用资源数量Available[]");
panel1.add(labelName);
for(int i=0;i<rNum;i++)
{
TextField tfRName =new TextField(3);
TextField tfAvailable=new TextField(3);
map.put("tfRName"+i, tfRName);
map.put("tfAvailable"+i, tfAvailable);
}
Label label1=new Label("名称");
panel1.add(label1);
for(int i=0;i<rNum;i++)
{
panel1.add(map.get("tfRName"+i));
}
Label label2=new Label("数量");
panel1.add(label2);
for(int i=0;i<rNum;i++)
{
panel1.add(map.get("tfAvailable"+i));
}
panel1.add(butSetName);
butSetName.addActionListener(this);
validate();
}
public void initMax()
{
removeAll();
Panel panel1=new Panel();
Label labelMax=new Label("请输入最大需求矩阵Max"+"["+pNum+"]*["+rNum+"]");
add(panel1);
for(int i=0;i<pNum;i++)
{
for(int j=0;j<rNum;j++)
{
TextField tfMax=new TextField(3);
map.put("tfMax["+i+"]["+j+"]", tfMax);
}
}
labelMax.setSize((map.get("tfMax[0][0]").getWidth())*rNum,map.get("tfMax[0][0]").getHeight());
panel1.add(labelMax);
for(int i=0;i<pNum;i++)
{
for(int j=0;j<rNum;j++)
{
panel1.add(map.get("tfMax["+i+"]["+j+"]"));
}
}
panel1.add(butMax);
butMax.addActionListener(this);
validate();
}
public void initAllocation()
{
removeAll();
Panel panel1=new Panel();
Label labelAllocation=new Label("请输入分配矩阵Allocation"+"["+pNum+"]*["+rNum+"]");
add(panel1);
for(int i=0;i<pNum;i++)
{
for(int j=0;j<rNum;j++)
{
TextField tfAllocation=new TextField(3);
map.put("tfAllocation["+i+"]["+j+"]", tfAllocation);
}
}
labelAllocation.setSize((map.get("tfAllocation[0][0]").getWidth())*rNum,map.get("tfAllocation[0][0]").getHeight());
panel1.add(labelAllocation);
for(int i=0;i<pNum;i++)
{
for(int j=0;j<rNum;j++)
{
panel1.add(map.get("tfAllocation["+i+"]["+j+"]"));
}
}
panel1.add(butAllocation);
butAllocation.addActionListener(this);
validate();
}
public void safe()//安全性算法
{
System.out.println("sdfsdfsdfsdfsdfdfsdfsdfdfsdfsdfdfsdfdf");
int i,j,k=0,m,apply;
boolean finish[]=new boolean [100];

for (i=0;i<rNum;i++)
{
Work[i]=Available[i];
}
for(i=0;i<pNum;i++)
for(j=0;j<rNum;j++)
{
Need[i][j]=Max[i][j]-Allocation[i][j];
}
for(i=0;i<pNum;i++)

   apply=0;
   for(j=0;j<rNum;j++)
   {
    if ( finish[i]==false&&Need[i][j]<=Work[j])
    {   
     apply++;
     if(apply==rNum)
     {
      for(m=0;m<rNum;m++)
         Work[m]=Work[m]+Allocation[i][m];//变分配数
         finish[i]=true;
      temp[k]=i;
      i=-1; 
         k++;
     }
    }
   }
}
for(i=0;i<pNum;i++)
{
   if(finish[i]==false)
   {
 Panel panel1=new Panel();
 Panel panel2=new Panel();
 dialogUnsafe.setLayout(new BorderLayout());
 dialogUnsafe.add(panel1,BorderLayout.NORTH);
 dialogUnsafe.add(panel2,BorderLayout.CENTER);  
 Label labelUnsafe=new Label("系统不安全!返回"); 
 panel1.add(labelUnsafe);
 dialogUnsafe.setBackground(new Color(255,228,196));
 dialogUnsafe.setSize(200, 100);  
 dialogUnsafe.setVisible(true);
     //System.out.println("系统不安全");//不成功系统不安全
 butEsc.setBackground(new Color(255,228,196));
 panel2.add(butEsc);
 butEsc.addActionListener(this);
   }
}
outPutSafe();
}

解决方案 »

  1.   


    public void outPutSafe()
    {
    removeAll();
    Panel panel1=new Panel();
    Panel panel2=new Panel();
    setLayout(new BorderLayout());
    add(panel1,BorderLayout.CENTER);
    add(panel2,BorderLayout.SOUTH);
    //panel2.setBackground(new Color(1,1,1));
    TextArea taOutPutSafe=new TextArea();
    panel1.add(taOutPutSafe);
    taOutPutSafe.append("系统目前可用的资源[Avaliable]:\n");
    String a="";
    String safeString ="";
    for(int i=0;i<pNum;i++)
    {
    a=safeString.concat(temp[i]+"");
    safeString=a;
    if(i<pNum-1)
    {
    a=safeString.concat("->");
    safeString=a;
    }
    }
    for (int i=0;i<rNum;i++)
    taOutPutSafe.append(name[i]+"");
    taOutPutSafe.append("\n");
    for (int i=0;i<rNum;i++)
    taOutPutSafe.append(Available[i]+"");
    taOutPutSafe.append("\n");
    taOutPutSafe.append("进程名 Max Allocation     Need ");
    taOutPutSafe.append("\n ");
    for (int j=0;j<3;j++)
    {
    for(int i=0;i<rNum;i++)
    taOutPutSafe.append(name[i]+"");
    taOutPutSafe.append(" ");
    }
    taOutPutSafe.append("\n");
    for(int i=0;i<pNum;i++)
    {
    taOutPutSafe.append(" "+i+" ");
    for(int j=0;j<rNum;j++)
    taOutPutSafe.append(Max[i][j]+" ");
    taOutPutSafe.append(" ");
    for(int j=0;j<rNum;j++)
    taOutPutSafe.append(Allocation[i][j]+" ");
    taOutPutSafe.append(" ");
    for(int j=0;j<rNum;j++)
    taOutPutSafe.append(Need[i][j]+" ");
    taOutPutSafe.append("\n");
    }
    taOutPutSafe.append("系统是安全的!\n");
    taOutPutSafe.append("系统的安全序列是:\n");
    taOutPutSafe.append(safeString);
    taOutPutSafe.setBackground(new Color(255,228,196));
    taOutPutSafe.setEditable(false);
    panel2.add(butChange);
    panel2.add(butFenPei);
    butChange.addActionListener(this);
    butFenPei.addActionListener(this);
    validate();
    }
    public void changeR()
    {
    removeAll();
    Panel panel1=new Panel();
    add(panel1);
    TextArea ta=new TextArea(5,40);
    String a="系统目前可用的资源[Available]:\n";
    for (int i=0;i<rNum;i++)
    {
    a=a.concat(name[i]+":"+Available[i]+"\n");
    }
    a=a.concat("请输入每种资源的增加值\n");
    ta.setText(a);
    ta.setBackground(new Color(255,228,196));
    ta.setEditable(false);
    panel1.add(ta);
    for (int i=0;i<rNum;i++)
    {
    Label labelChangeR=new Label(name[i]+"");
    TextField tfChangeR=new TextField(3);
    mapt.put("labelChangeR"+i, labelChangeR);
    map.put("tfChangeR"+i, tfChangeR);
    panel1.add(mapt.get("labelChangeR"+i));
    panel1.add(map.get("tfChangeR"+i));
    }
    panel1.add(butChangeS);
    butChangeS.addActionListener(this);
    validate();
    }
    public void fenpeiR()
    {
    removeAll();
    Panel panelFen=new Panel();
    add(panelFen);
    Label labelFen1=new Label("请输入要求分配资源的进程号(0-"+(pNum-1)+"):");
    panelFen.add(labelFen1);
    TextField tfFen=new TextField(3);
    map.put("tfFen", tfFen);
    panelFen.add(tfFen);
    for (int i=0;i<rNum;i++)
    {
    Label labelFenR=new Label(name[i]+"");
    TextField tfFenR=new TextField(3);
    mapt.put("labelFenR"+i, labelFenR);
    map.put("tfFenR"+i, tfFenR);
    panelFen.add(mapt.get("labelFenR"+i));
    panelFen.add(map.get("tfFenR"+i));
    }
    panelFen.add(butFenPeiS);
    butFenPeiS.addActionListener(this);
    validate();
    }
    public void actionPerformed(ActionEvent event)
    {
    if(event.getSource() == butS )
    {
    pNum =Integer.parseInt(getProNum.getText());
    rNum =Integer.parseInt(getResNum.getText());
    setRName();
    }
    if(event.getSource() == butSetName)
    {
    for(int i=0;i<rNum;i++)
    {
    name[i]=map.get("tfRName"+i).getText();
    }
    for(int i=0;i<rNum;i++)
    {
    Available[i]=Integer.parseInt(map.get("tfAvailable"+i).getText());
    }
    initMax();
    }
    if(event.getSource() == butMax)
    {
    for(int i=0;i<pNum;i++)
    {
    for(int j=0;j<rNum;j++)
    {
    Max[i][j]=Integer.parseInt(map.get("tfMax["+i+"]["+j+"]").getText());
    }
    }
    initAllocation();
    }
    if(event.getSource() == butAllocation)
    {
    for(int i=0;i<pNum;i++)
    {
    for(int j=0;j<rNum;j++)
    {
    Allocation[i][j]=Integer.parseInt(map.get("tfAllocation["+i+"]["+j+"]").getText());
    }
    }
    safe();
    }
    if(event.getSource() ==butChange)
    changeR();
    if(event.getSource() ==butChangeS)
    {
    //System.out.println("dfsfsf");
    for(int i=0;i<rNum;i++)
    {
    Available[i]=Integer.parseInt(map.get("tfChangeR"+i).getText())+Available[i];
    //System.out.println(Integer.parseInt(map.get("tfChangeR"+i).getText()));
    }
    safe();
    }
    if(event.getSource() ==butFenPei)
    fenpeiR();
    if(event.getSource() ==butFenPeiS)
    {
    int i=Integer.parseInt(map.get("tfFen").getText());
    for(int j=0;j<rNum;j++)
    {
    Allocation[i][j]=Integer.parseInt(map.get("tfFenR"+i).getText())+Allocation[i][j];
    Available[j]=Available[j]-Integer.parseInt(map.get("tfFenR"+i).getText());
    }
    safe();
    }
    if(event.getSource() ==butEsc)
    {
    setRName();
    dialogUnsafe.setVisible(false);
    }
    }
    }