📄 myframe.java
字号:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.ComponentOrientation;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.border.EtchedBorder;
import javax.swing.border.LineBorder;
import javax.swing.border.TitledBorder;
import java.util.Random;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.DefaultListModel;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class MyFrame extends JFrame {
private JList list_4;
private JTextField currenttimefield;
private JTextField runtimefield;
private JTextField runmemoryfield;
private JTextField runnamefield;
/**
*
*/
private static final long serialVersionUID = 1L;
private JList list_3;
private JList list_2;
private JList list_1;
DefaultListModel model_2 = new DefaultListModel();// 用于反映到后备队列的变化list_2
DefaultListModel model_1 = new DefaultListModel();// 用于反映到就绪队列的变化list_1
DefaultListModel model_3 = new DefaultListModel();// 用于反映到挂起队列的变化list_3
DefaultListModel model_4 = new DefaultListModel();// 用于反映到挂起队列的变化list_4
final JButton runButton = new JButton();
int timeslice = 10;// 时间片
int memory = 256;// 总内存
int systemmemory = 30;// 系统内存
int availablememory = memory - systemmemory;// 可供分配的内存
Vector<PCB> reserve = new Vector<PCB>();// 就绪队列
Vector<PCB> suspend = new Vector<PCB>();// 挂起队列
Vector<PCB> ready = new Vector<PCB>();// 后备队列
public MyFrame() {
super();
setTitle("时间片轮转演示");
getContentPane().setLayout(null);
this.setVisible(true);
final JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setBounds(77, 10, 100, 161);
getContentPane().add(scrollPane_1);
list_1 = new JList();
scrollPane_1.setViewportView(list_1);
list_1.setBorder(new TitledBorder(null, "就绪队列", TitledBorder.CENTER,
TitledBorder.DEFAULT_POSITION, null, null));
final JScrollPane scrollPane_2 = new JScrollPane();
scrollPane_2.setBounds(197, 10, 100, 161);
getContentPane().add(scrollPane_2);
list_2 = new JList();
scrollPane_2.setViewportView(list_2);
list_2.setBorder(new TitledBorder(null, "后备队列", TitledBorder.CENTER,
TitledBorder.DEFAULT_POSITION, null, null));
list_2.addMouseListener(new SuretoSuspend());
final JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
final JMenu menu = new JMenu();
menu.setText("操作");
menuBar.add(menu);
final JMenuItem newItemMenuItem = new JMenuItem();
newItemMenuItem.addActionListener(new SystemSet());
newItemMenuItem.setText("设置");
menu.add(newItemMenuItem);
final JMenuItem newItemMenuItem_1 = new JMenuItem();
newItemMenuItem_1.addActionListener(new Addprocess());
newItemMenuItem_1.setText("添加");
menu.add(newItemMenuItem_1);
this.setBounds(250, 200, 526, 421);
this.addWindowListener(new WindowAdapter() {
public void windowClosed(WindowEvent e) {
dispose();
System.exit(0);
}
});
// final JButton runButton = new JButton();
runButton.addActionListener(new Running());
runButton.setVisible(false);
runButton.setText("Run");
runButton.setBounds(433, 10, 63, 28);
getContentPane().add(runButton);
final JScrollPane scrollPane_3 = new JScrollPane();
scrollPane_3.setBounds(314, 10, 100, 161);
getContentPane().add(scrollPane_3);
list_3 = new JList();
list_3.setBorder(new TitledBorder(null, "挂起队列", TitledBorder.CENTER,
TitledBorder.DEFAULT_POSITION, null, null));
scrollPane_3.setViewportView(list_3);
list_3.addMouseListener(new SuspendtoReserve());
final JPanel panel = new JPanel();
panel.setLayout(null);
panel.setBorder(new TitledBorder(null, "Running Process",
TitledBorder.DEFAULT_JUSTIFICATION,
TitledBorder.DEFAULT_POSITION, null, null));
panel.setBounds(44, 193, 253, 161);
getContentPane().add(panel);
final JLabel nameLabel = new JLabel();
nameLabel.setText("ProcessName:");
nameLabel.setBounds(10, 26, 98, 18);
panel.add(nameLabel);
runnamefield = new JTextField();
runnamefield.setBounds(137, 24, 87, 22);
panel.add(runnamefield);
final JLabel needmemoryLabel = new JLabel();
needmemoryLabel.setText("NeedMemory:");
needmemoryLabel.setBounds(10, 54, 98, 18);
panel.add(needmemoryLabel);
final JLabel needtimeLabel = new JLabel();
needtimeLabel.setText("NeedTime:");
needtimeLabel.setBounds(10, 90, 98, 18);
panel.add(needtimeLabel);
runmemoryfield = new JTextField();
runmemoryfield.setBounds(137, 52, 87, 22);
panel.add(runmemoryfield);
runtimefield = new JTextField();
runtimefield.setBounds(137, 88, 87, 22);
panel.add(runtimefield);
final JLabel runningSecondsLabel = new JLabel();
runningSecondsLabel.setText("Running seconds:");
runningSecondsLabel.setBounds(10, 120, 113, 18);
panel.add(runningSecondsLabel);
currenttimefield = new JTextField();
currenttimefield.setBounds(137, 116, 87, 22);
panel.add(currenttimefield);
final JScrollPane scrollPane = new JScrollPane();
scrollPane
.setBorder(new TitledBorder(null, "完成队列", TitledBorder.CENTER,
TitledBorder.DEFAULT_POSITION, null, null));
scrollPane.setBounds(314, 193, 100, 161);
getContentPane().add(scrollPane);
list_4 = new JList();
list_4.setBorder(new LineBorder(Color.LIGHT_GRAY, 1, false));
scrollPane.setViewportView(list_4);
}
class SuretoSuspend extends MouseAdapter {// reserve to suspend
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
int index = list_2.locationToIndex(e.getPoint());
suspend.add(reserve.get(index));
model_3.addElement(reserve.get(index).getname());
list_3.setModel(model_3);
model_2.remove(index);
reserve.remove(index);
}
}
}
class SuspendtoReserve extends MouseAdapter {// suspend to reserve
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
int index = list_3.locationToIndex(e.getPoint());
reserve.add(suspend.get(index));
model_2.addElement(suspend.get(index).getname());
model_3.remove(index);
suspend.remove(index);
}
}
}
class MyThread extends Thread {
public void run() {
runButton.setVisible(false);
while (!reserve.isEmpty()
&& availablememory >= reserve.firstElement()
.getneedmemory()) {
ready.add(reserve.firstElement());
availablememory = availablememory
- reserve.firstElement().getneedmemory();
reserve.remove(0);
model_2.remove(0);
// list_2.setModel(model_2);
model_1.addElement(ready.lastElement().getname());
list_1.setModel(model_1);
}
// 写好此方法,就成功
// -----调度运行-----------------------------
/*---------abc*/
while (!ready.isEmpty()) {
for (int i = 0; i < ready.size(); i++) {
// System.out.println("Running process:
// "+ready.get(i).toString());
runnamefield.setText(ready.get(i).getname());
runmemoryfield.setText("" + ready.get(i).getneedmemory());
runtimefield.setText("" + ready.get(i).getneedtime());
for (int j = 1; j <= timeslice; j++) {
// System.out.println("Running "+j+" seconds");
currenttimefield.setText("" + j);
int temptime = ready.get(i).getneedtime();
temptime--;
ready.get(i).setneedtime(temptime);
if (ready.get(i).getneedtime() == 0) {
// System.out.println("Done!!!");
availablememory = availablememory
+ ready.get(i).getneedmemory();//释放内存
model_4.addElement(ready.get(i).getname());// 加入完成队列
list_4.setModel(model_4);
ready.remove(i);// 从就绪队列中删除此进程
model_1.remove(i);
list_1.setModel(model_2);
i++;// 调整下一个运行的进程
break;
}
try {// 小暂停1s,代表运行1s
sleep(1000);
} catch (InterruptedException ie) {
}
}// for(j) cycle
while (!reserve.isEmpty()
&& availablememory >= reserve.firstElement()
.getneedmemory()) {
ready.add(reserve.firstElement());
availablememory = availablememory
-reserve.firstElement().getneedmemory();
reserve.remove(0);
model_2.remove(0);
list_2.setModel(model_2);
model_1.addElement(ready.lastElement().getname());
list_1.setModel(model_1);
}
}// for(i) cycle
}// while()
runButton.setVisible(true);
// --------------------------------------
/*
*/// ------abc
}
}
// 此类用于系统设置
class SetFrame extends JFrame {
private JTextField textField_2;
private JTextField textField_1;
private JTextField textField;
public SetFrame() {
super();
setSize(new Dimension(350, 250));
setTitle("设置参数");
this.setVisible(true);
final JPanel panel = new JPanel();
panel.setLayout(null);
getContentPane().add(panel, BorderLayout.CENTER);
final JLabel label = new JLabel();
label.setText("时间片:");
label.setBounds(55, 40, 75, 27);
panel.add(label);
textField = new JTextField();
textField.setText("10");
textField.setBounds(136, 40, 103, 27);
panel.add(textField);
final JLabel label_1 = new JLabel();
label_1.setText("内存大小:");
label_1.setBounds(55, 89, 75, 27);
panel.add(label_1);
textField_1 = new JTextField();
textField_1.setText("256");
textField_1.setBounds(136, 89, 103, 27);
panel.add(textField_1);
final JButton button = new JButton();
button.addActionListener(new SuretoSet());
button.setText("确定");
button.setBounds(267, 79, 65, 28);
panel.add(button);
final JLabel label_2 = new JLabel();
label_2.setText("系统内存:");
label_2.setBounds(55, 132, 66, 27);
panel.add(label_2);
textField_2 = new JTextField();
textField_2.setText("30");
textField_2.setBounds(136, 132, 103, 27);
panel.add(textField_2);
}
// 此类用于确认设置
class SuretoSet implements ActionListener {
public void actionPerformed(final ActionEvent e) {
int time = Integer.parseInt(textField.getText().trim());
int memorysize = Integer.parseInt(textField_1.getText().trim());
int osmemory = Integer.parseInt(textField_2.getText().trim());
timeslice = time;
memory = memorysize;
systemmemory = osmemory;
availablememory = memory - systemmemory;
dispose();
}
}
}
// 此类用于添加进程
class AddFrame extends JFrame {
private JTextField needmemoryfield;
private JTextField needtimefield;
private JTextField namefield;
private int countproc = 1;// 对进程依次命名
private Random ran = new Random();
public AddFrame() {
super();
this.setVisible(true);
this.setTitle("添加进程");
getContentPane().setLayout(null);
setSize(new Dimension(350, 300));
final JLabel label = new JLabel();
label.setText("进程名:");
label.setBounds(80, 37, 66, 18);
getContentPane().add(label);
namefield = new JTextField();
namefield.setBounds(170, 35, 87, 22);
namefield.setText("Process_" + countproc);
getContentPane().add(namefield);
final JLabel label_1 = new JLabel();
label_1.setText("所需时间:");
label_1.setBounds(80, 79, 66, 18);
getContentPane().add(label_1);
needtimefield = new JTextField();
needtimefield.setBounds(170, 77, 87, 22);
needtimefield.setText("" + (ran.nextInt(21) + 10));// 所需时间都在10~30之间的随机数
getContentPane().add(needtimefield);
final JLabel label_2 = new JLabel();
label_2.setText("所需内存:");
label_2.setBounds(80, 123, 66, 18);
getContentPane().add(label_2);
needmemoryfield = new JTextField();
needmemoryfield.setBounds(170, 121, 87, 22);
needmemoryfield.setText("" + (ran.nextInt(29) + 1));// 所需内存都在1~30
getContentPane().add(needmemoryfield);
final JButton button = new JButton();
button.addActionListener(new SuretoAdd());
button.setText("添加");
button.setBounds(70, 175, 87, 28);
getContentPane().add(button);
final JButton button_1 = new JButton();
button_1.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent arg0) {
dispose();
}
});
button_1.setText("结束");
button_1.setBounds(186, 175, 80, 28);
getContentPane().add(button_1);
}
class SuretoAdd implements ActionListener {
public void actionPerformed(final ActionEvent e) {
PCB temp = new PCB();
temp.setname(namefield.getText());
temp.setneedtime(Integer.parseInt(needtimefield.getText()
.trim()));
temp.setneedmemory(Integer.parseInt(needmemoryfield.getText()
.trim()));
reserve.add(temp);// 将其加入到后备队列
runButton.setVisible(true);// 运行按钮为可见
// 动作反映到图形界面-------
model_2.addElement(reserve.lastElement().getname());
list_2.setModel(model_2);
// ---------------------
countproc++;
namefield.setText("Process_" + countproc);
needtimefield.setText("" + (ran.nextInt(21) + 10));
needmemoryfield.setText("" + (ran.nextInt(29) + 1));
}
}
}
class SystemSet implements ActionListener {
public void actionPerformed(final ActionEvent arg0) {
new SetFrame();
}
}
class Addprocess implements ActionListener {
public void actionPerformed(final ActionEvent arg0) {
new AddFrame();
}
}
class Running implements ActionListener {// 运行命令
public void actionPerformed(final ActionEvent arg0) {
// runButton.setVisible(false);
// running();
new MyThread().start();
// runButton.setVisible(true);
}
}
public static void main(String[] args) {
new MyFrame();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -