📄 range_course_system.java
字号:
import java.awt.*;
import javax.swing.*;
import java.applet.*;
import java.util.*;
import java.awt.event.*;
import java.awt.geom.*;
import javax.swing.border.*;
import java.io.*;
import java.awt.CardLayout.*;
public class Range_Course_System {
public static void main(String[] args){
Main_Frame f=new Main_Frame();
f.show();
}
}
class Main_Frame implements ActionListener{//显示主界面
CardLayout card;
Frame frame;
JTextArea display;//显示内容的文本区
Thread t1;
int signal=0;//以signal为标识符控制,只有打开文件后才能开始排课和保存文件
JTextField text;
JFrame f;
Panel panel2;
JButton b1=new JButton("方案一");////
JButton b2=new JButton("方案二");///
JButton b3=new JButton("方案三");///
JButton b4=new JButton("排课");
Produce_TopologicalSort g=new Produce_TopologicalSort();
public void show(){
frame=new Frame();
frame.setSize(550,420);
frame.setTitle("排课系统");
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension screenSize=kit.getScreenSize();
int x=(screenSize.width-400)/2;
int y=(screenSize.height-400)/2;
frame.setLocation(x,y);
card=new CardLayout();
frame.setLayout(card);
MenuBar mb1=new MenuBar();
frame.setMenuBar(mb1);
Menu mf1=new Menu("文 件");
Menu mf2=new Menu("功 能");
mb1.add(mf1);
mb1.add(mf2);
MenuItem mf3=new MenuItem("打 开");
MenuItem mf4=new MenuItem("保 存");
MenuItem mf5=new MenuItem("开始排课");
mf1.add(mf3);
mf1.add(mf4);
thread_Canvas panel1=new thread_Canvas();
panel2=new Panel();
display=new JTextArea();
JScrollPane scroll=new JScrollPane(display);//给文本区添加滚动条
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
////////////
JPanel epanel=new JPanel();////
JPanel bpanel=new JPanel();
JPanel bbpanel=new JPanel();
bpanel.setLayout(null);
bbpanel.setLayout(null);
bpanel.add(b1);///
bpanel.add(b2);///
bbpanel.add(b3);///
bbpanel.add(b4);
epanel.setLayout(new GridLayout(3,1));////
Image bg;
Toolkit tk=Toolkit.getDefaultToolkit(); //创建同位体接口
bg=tk.getImage("java.jpg");
ImageIcon pic1 = new ImageIcon(bg); //创建一个图片对象.
JLabel label = new JLabel();
label.setIcon(pic1) ;
label.setOpaque(true);
b1.setBounds(20,40,80,30);
b2.setBounds(20,80,80,30);
b3.setBounds(20,0,80,30);
b4.setBounds(20,40,80,30);
epanel.add(label);
epanel.add(bpanel);
epanel.add(bbpanel);
////////////////
display.setEditable(false);
panel2.setLayout(new BorderLayout());
panel2.add(scroll,BorderLayout.CENTER);
panel2.add(epanel,BorderLayout.EAST);
//////
t1=new Thread(panel1);
t1.start();//显示动态欢迎界面
mf3.addActionListener(this);
mf4.addActionListener(this);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
mf2.add(mf5);
mf5.addActionListener(this);
frame.add(panel1,"1");
frame.add(panel2,"2");
frame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){ System.exit(0);}});
frame.setVisible(true);
}
public void actionPerformed(ActionEvent event){//响应菜单事件
String str;
Process_FileMenu react=new Process_FileMenu(display,t1,g);
if(event.getActionCommand()=="打 开"){
card.show(frame,"2");
signal=1;
b1.setEnabled(false);
b2.setEnabled(false);
b3.setEnabled(false);
react.open();
//frame.resize(400,500);
return;
}
if(event.getActionCommand()=="保 存"){
if(signal==1){//必须之前有打开文件操作才能响应保存文件
card.show(frame,"2");
react.save();
}
return;
}
if(event.getActionCommand()=="开始排课"||event.getActionCommand()=="排课"){
if(signal==1) Input_TermNum();//必须打开文件后才能响应开始排课
}
if(event.getActionCommand()=="确定"){
str=text.getText();//将输入的内容转化为整型
g.termNum=Integer.parseInt(str);
if(g.termNum<5) JOptionPane.showMessageDialog(null,"排课学期数至少为 5 !!!","错误提示",JOptionPane.WARNING_MESSAGE);
if(g.termNum>20) JOptionPane.showMessageDialog(null,"排课学期数至多为 20 !!!","错误提示",JOptionPane.WARNING_MESSAGE);
if(g.termNum>=5&&g.termNum<=20){
f.setVisible(false);
if(g.termNum==5||g.termNum==20){
b1.setEnabled(true);
b2.setEnabled(false);
b3.setEnabled(false);
}
else{
b1.setEnabled(true);
b2.setEnabled(true);
b3.setEnabled(true);
}
g.begin();//根据从文件读出课程和输入的学期数生成有向图
g.indirect_print(1);
}
}
if(event.getActionCommand()=="方案一"){
if(signal==1) g.indirect_print(1);
}
if(event.getActionCommand()=="方案二"){
if(signal==1) g.indirect_print(2);
}
if(event.getActionCommand()=="方案三"){
if(signal==1) g.indirect_print(3);
}
}
public void Input_TermNum(){//显示要求输入学期数的界面
int x,y;
f=new JFrame();
f.setTitle("排课学期数");
f.setSize(300,100);
JPanel panel1=new JPanel();
JLabel label=new JLabel("请输入学期数:");
text=new JTextField("5",5);
JButton button=new JButton("确定");
panel1.add(label);
panel1.add(text);
panel1.add(button);
button.addActionListener(this);
f.add(panel1);
Point p=frame.getLocation();//设置显示输入框的位置
x=(int)p.getX();
y=(int)p.getY();
x=x+50;
y=y+100;
f.setLocation(x,y);
f.setVisible(true);
}
}
class thread_Canvas extends JPanel implements Runnable{//动态显示欢迎字幕
public thread_Canvas(){
setBackground(Color.RED);
}
public void paintComponent(Graphics g){ //不会自动调用
super.paintComponent(g);
g.setFont(fnt);
g.drawString(str1,x1,y1);
g.drawString(str2,x2,y2);
g.drawString(str3,x3,y3);
g.drawString(str4,x4,y4);
}
public void run(){
try{
for( ; ; ){
//if(x2<=-140) x2=620;
//if(x2==620) x1=550;
if(x4<=-140) x4=670;
if(x4==670){
x1=550;
x2=620;
x3=720;
}
x1-=10;
x2-=10;
x3-=10;
x4-=10;
repaint();
Thread.sleep(100);
}
}catch(InterruptedException e){ }
}
Font fnt=new Font("宋体",Font.BOLD,25);//设置欢迎字体的格式
String str1=new String("欢迎进入");
String str2=new String("排课系统!!");
String str3=new String("李国超");
String str4=new String("2000631000914");
int x1=550,y1=100,x2=620,y2=180,x3=720,y3=280,x4=670,y4=320;
int i;
}
class Process_FileMenu extends JFrame{//实现文件菜单的"打开"和"保存"功能
public Process_FileMenu(JTextArea display,Thread t1,Produce_TopologicalSort g){
this.display=display;
this.t1=t1;
this.g=g;
}
public void open(){//打开文件
choice=fileChooser.showOpenDialog(this);
if(choice==JFileChooser.APPROVE_OPTION){
chosenFile=fileChooser.getSelectedFile();
}
readFromFile(chosenFile);
}
public void save(){//保存文件
if(chosenFile==null){
newfile();
}
if(chosenFile!=null) writeToFile(chosenFile);
}
public void newfile(){//生成新文件
choice =fileChooser.showSaveDialog(this);
if(choice==JFileChooser.APPROVE_OPTION){
chosenFile=fileChooser.getSelectedFile();
writeToFile(chosenFile);
}
}
public void readFromFile(File file){//从文件中读出内容
int i=0;
display.setText("");
String fileName=file.getAbsolutePath();
try{
BufferedReader inStream=new BufferedReader(new FileReader(fileName));
String line=inStream.readLine();
while(line!=null){
content[i]=line;//将文件每一行的内容作为一个字符串保存到数组中
display.append(line+"\n");//将文件内容显示到文本区
line=inStream.readLine();//一行行读取文件的内容
i++;
}
g.split_content(content,i,display);//将文件每一行内的课程名和课程编号分离
inStream.close();
t1.stop();//停止线程,即停止显示动态欢迎字幕
}catch(FileNotFoundException e){
JOptionPane.showConfirmDialog(this,fileName+"文件找不到!!","操作提示",JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE);
}catch(IOException e){
JOptionPane.showConfirmDialog(this,fileName+"无法预料错误!!","操作提示",JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE);
}
}
public void writeToFile(File file){//将要保存的内容写入文件
String fileName=file.getAbsolutePath();
try{
FileWriter outStream=new FileWriter(fileName);
outStream.write(display.getText());
outStream.close();
}catch(IOException e){
JOptionPane.showConfirmDialog(this,"无法预料错误: "+e.getMessage(),"操作提示",JOptionPane.DEFAULT_OPTION,JOptionPane.ERROR_MESSAGE);
}
}
String[] content=new String[20];//一个数组元素保存从文件读出的一行内容
JTextArea display;
File chosenFile;
int choice;
JFileChooser fileChooser=new JFileChooser();
Range_Course_System frame;
CardLayout card;
JPanel panel2;
Thread t1;
Produce_TopologicalSort g;
}
class Produce_TopologicalSort{//生成拓扑有序序列
public Produce_TopologicalSort(){
}
public void begin(){
Create_Graph();//以邻接表的方式存储图
TopologicalSort();//生成拓扑有序序列
range=new Range_Course();
range.ArrangeCourse();//开始排课
}
public void indirect_print(int i){
range.print_result(i);
}
public void Create_Graph(){//以邻接表的方式存储图
int i,j;
for(i=0;i<20;i++){
VNode g=new VNode();
vertices[i]=g;//实例化每个对象数组无素
vertices[i].data=course[i];//将课程名作为顶点信息保存
p=vertices[i];
for(j=0;j<outdeg[i];j++){//存储每个头结点的邻接点
ArcNode first=new ArcNode();
p.firstarc[j]=first;//实例化每个对象数组无素
p.firstarc[j].adjvex=next[i][j];
p.firstarc[j].info=1;
}
ArcNode first=new ArcNode();
p.firstarc[j]=first;
p.firstarc[j].info=0;
}
}
public void FindInDegree(){//计算每个结点的入度
int indeg=0;
for(int i=0;i<20;i++){
for(int j=0;j<20;j++){
p=vertices[j];
for(int k=0;k<outdeg[j];k++){
if(course_num[i]==p.firstarc[k].adjvex){
indeg++;
break;
}
}
}
indegree[i]=indeg;
indeg=0;
}
}
public int TopologicalSort(){
int count,k=0,n,i,j=0;
FindInDegree();
for(int m=0;m<20;m++) indegree_Copy[m]=indegree[m];//备份各结点的入度
for(int m=0;m<20;m++) if(indegree_Copy[m]==0) stack.push(m);
count=0;
while(!(stack.empty())){
str3=(stack.pop()).toString();//将pop()的返回值转变为字符串类型
i=Integer.parseInt(str3);//将字符串类型转为整型,即为入栈时的的元素
course_num[j]=i;
j++;
count++;
for(p=vertices[i],n=0;n<outdeg[i];n++){
if(p.firstarc[n].adjvex!=-1) k=p.firstarc[n].adjvex;
if((indegree_Copy[k])==0) stack.push(k);
}
}
if(count<20) return 0;
else return 1;
}
public void split_content(String[] content,int i,JTextArea display){//将文件每一行内的课程名和课程编号分离
int n,m=0,k,j,num,p;
this.display=display;
for(n=0;n<i;n++){//将分离的字符串放入数组
str1=content[n].split(" ",-2);//以空格为标识符分离每个数组元素
course_num[n]=(Integer.parseInt(str1[0])-1);//将每一课程编号减1,代替原来的课程编号
str[n]=new String[str1.length-1];//设置str[][]长度
for(j=1,k=0;j<str1.length;j++,k++) str[n][k]=str1[j];//保存分离后的字符串
}
for(n=0;n<i;n++){//分离课程名和各课程前提课程的编号到不同的数组
for(j=0;j<str[n].length;j++){
if(!str[n][j].equals("")){//如果字符串不为空,则以","分离字符串
str2=str[n][j].split(",");
try{
Integer.parseInt(str2[0]);//如果str2[0]为非整型(即课程名)则抛开异常
Input[n]=new int[str2.length];//设置Input[][]长度
for(m=0;m<str2.length;m++){//将各课程前提课程的编号减1保存到Input[][]数组
num=Integer.parseInt(str2[m]);
Input[n][m]=num-1;
}
}catch(NumberFormatException event){
course[n]=str2[0];//保存课程名到course[]数组
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -