import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.*;
import javax.swing.border.TitledBorder;
public class kaka extends JPanel implements ActionListener {
JPanel panel_north,panel_center,panel_south;//北、中、南三个面板
JPanel panel_north_1, panel_north_2, panel_south_1, panel_south_2;//面板中的面板
JButton button_fifo, button_lru, button_opt;//三种算法的三个按钮
JTextField text_wulikuai, text_yemian,text_queyeshu, text_queyelv, text_zhihuanshu, text_zhihuanlv;
JTextArea textarea;//中部过程输出区域
JTextArea textarea2;//随机序列显示区域
JTextArea textarea3;//手动输入序列显示区域
JScrollPane scrollPane_1 ;//上面三个文本区域应用的滚动条
JScrollPane scrollPane_2 ;
JScrollPane scrollPane_3 ;
private ButtonGroup buttonGroup = new ButtonGroup();//随机、手动序列单选按钮
final JRadioButton radioButton1,radioButton2;
randomNumber RN;//随机生成的数列
String m_random = "";// 用于存储页面序列
int m, n;//m物理块数 n页面总数
int wuli[];//存放物理块中现有的页面号
int xulie[];//页面存储序列数组
public kaka() {//构造初始化
panel_north = new JPanel();
panel_north_1 = new JPanel();
panel_north_2 = new JPanel();
panel_south = new JPanel();
panel_south_1 = new JPanel();
panel_south_2 = new JPanel();
panel_center = new JPanel();
text_wulikuai = new JTextField(4);
text_yemian = new JTextField(5);
text_queyeshu = new JTextField();
text_queyeshu.setEditable(false);
text_queyelv = new JTextField();
text_queyelv.setEditable(false);
text_zhihuanshu = new JTextField();
text_zhihuanshu.setEditable(false);
text_zhihuanlv = new JTextField();
text_zhihuanlv.setEditable(false);
panel_north_1.add(new JLabel(" 请输入数据-> "));
panel_north_1.add(new JLabel(" 物理块数 "));
panel_north_1.add(text_wulikuai);
text_wulikuai.addKeyListener(new NumListener());
panel_north_1.add(new JLabel(" 置换页面数 "));
panel_north_1.add(text_yemian);
text_yemian.addKeyListener(new NumListener());//添加键盘监听 只能输入数字和空格
panel_north_2.setLayout(new GridLayout(4, 1));
textarea2 = new JTextArea(1,60);
textarea3 = new JTextArea(1,70);
textarea2.setEditable(false);
textarea3.setEditable(false);
textarea2.setLineWrap(true); //输入内容自动换行
textarea2.setWrapStyleWord(true);//输入英文时不会将一个单词分在两行里
textarea3.setLineWrap(true);
textarea3.setWrapStyleWord(true);
textarea3.addKeyListener(new NumListener());
scrollPane_2 = new JScrollPane(textarea2);//文本区域应用滚动条
scrollPane_3 = new JScrollPane(textarea3);
radioButton1 = new JRadioButton();
panel_north_2.add(radioButton1);
buttonGroup.add(radioButton1);
radioButton1.setText("随机页面序列");
radioButton1.setSelected(true);
radioButton1.addActionListener(new ActionListener() {//选择按钮触发事件
public void actionPerformed(ActionEvent e) {
textarea3.setText("");
textarea3.setEditable(false);
}
});
panel_north_2.add(scrollPane_2);
radioButton2 = new JRadioButton();
panel_north_2.add(radioButton2);
buttonGroup.add(radioButton2);
radioButton2.setText("指定页面序列");
radioButton2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textarea2.setText("");
textarea3.setEditable(true);
//textarea3.setFocusable(true);这样获取焦点为什么不行?
//textarea3.grabFocus();//这样可行
textarea3.requestFocus(true);//获取焦点
}
});
panel_north_2.add(scrollPane_3);
panel_north.setLayout(new GridLayout(2, 2));
panel_north.add(panel_north_1);
panel_north.add(panel_north_2);
panel_center.setBorder(new TitledBorder(null, "页面置换过程", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
textarea = new JTextArea(20,60);
textarea.setEditable(false);
textarea.setLineWrap(true); //输入内容自动换行
textarea.setWrapStyleWord(true);//输入英文时不会将一个单词分在两行里
scrollPane_1 = new JScrollPane(textarea);
panel_center.add(scrollPane_1);
panel_south_1.setBorder(new TitledBorder(null, "数据统计结果", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, null, null));
panel_south_1.setLayout(new GridLayout(2, 2));
panel_south_1.add(new JLabel(" 缺页数"));
panel_south_1.add(text_queyeshu);
panel_south_1.add(new JLabel(" 缺页率"));
panel_south_1.add(text_queyelv);
panel_south_1.add(new JLabel(" 置换次数"));
panel_south_1.add(text_zhihuanshu);
panel_south_1.add(new JLabel(" 置换率"));
panel_south_1.add(text_zhihuanlv);
button_fifo = new JButton("FIFO");
button_lru = new JButton("LRU");
button_opt = new JButton("OPT");
button_fifo.addActionListener(this);
button_lru.addActionListener(this);
button_opt.addActionListener(this);
panel_south_2.add(button_fifo);
panel_south_2.add(button_lru);
panel_south_2.add(button_opt);
setLayout(new BorderLayout());
panel_south.setLayout(new GridLayout(2, 2));
panel_south.add(BorderLayout.NORTH, panel_south_1);
panel_south.add(BorderLayout.CENTER, panel_south_2);
add(BorderLayout.NORTH, panel_north);
add(BorderLayout.CENTER, panel_center);
add(BorderLayout.SOUTH, panel_south);
}
public void inputCheck(){//计算前检查输入并初始化相关数据
if(text_wulikuai.getText().trim().length()==0){
JOptionPane.showMessageDialog(null, "请输入物理块数!");
text_wulikuai.requestFocus(true);
return;
}
if(text_yemian.getText().length()==0){
JOptionPane.showMessageDialog(null, "请输入页面总数!");
text_yemian.requestFocus(true);
return;
}
m = Integer.parseInt(text_wulikuai.getText().trim());
n = Integer.parseInt(text_yemian.getText().trim());
if(m==0){
JOptionPane.showMessageDialog(null, "物理块数不能为0!");
text_wulikuai.setText("");
text_wulikuai.requestFocus(true);
return;
}
if(n==0){
JOptionPane.showMessageDialog(null, "页面总数不能为0!");
text_yemian.setText("");
text_yemian.requestFocus(true);
return;
}
if(m>=n){
JOptionPane.showMessageDialog(null, "物理块小于页面总数!");
text_yemian.requestFocus(true);
return;
}
if(radioButton1.isSelected()){//随机产生
String str1="",str2="";
RN = new randomNumber();
xulie = RN.rand(n, n);
for (int i = 0; i < n; i++) {
str2 = String.valueOf(xulie[i]);
str1 = str1 + " " + str2;
}
textarea2.setText("" + str1);//在随机序列区域中显示生成的页面序列
}
if(radioButton2.isSelected()){//手动输入
if(textarea3.getText().trim().length()==0){
JOptionPane.showMessageDialog(null, "请输入页面序列!");
textarea3.requestFocus(true);
return;
}
String input = textarea3.getText();//获取输入的内容
String[] change = input.split("[\\t \\n]+");//将输入内容以空格或回车为分隔 切割转换成字符串数组
if(change.length<n){
JOptionPane.showMessageDialog(null, "输入页面序列个数小于总页面数!");
textarea3.requestFocus(true);
return;
}else if(change.length>n){
JOptionPane.showMessageDialog(null, "输入页面序列个数大于总页面数!");
textarea3.requestFocus(true);
return;
}
int arr[] = new int[change.length];
for(int d = 0;d<change.length;d++)
{
arr[d] = Integer.parseInt(change[d]);//字符串数组转换成整形数组
if(arr[d]>n){
JOptionPane.showMessageDialog(null, "请不要在输入页面序列中输入大于页面总数的页面数!");
textarea3.requestFocus(true);
return;
}
//xulie[d] = Integer.parseInt(change[d]);为什么不能这样直接换
}
xulie = arr;//将转换后的数组赋值给存储序列的整形数组
}
}
publ