⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 range_course_system.java

📁 排课程序
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
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 + -