我的Java小專案需要這樣去完成--學生資訊採集系統(歡迎加入)

javascript前鋒發表於2013-12-23
 

專案名為新生資訊採集系統,要求如下:

1、能夠拍照,並儲存照片。

2、能夠在系統中展示excel表格。

3、能夠匯入匯出excel表格。

其實根據個人想法可以增加更多的功能,專案我已經完成70%左右,由於該專案已經流產,所以這裡給大家分享一下。

該專案是給幫朋友寫的,但是由於他擁有了一份較為完美的程式,所以我所做的就成了一個個人的小練習,將程式碼貼出來是希望有人能夠繼續完成其中需要改善的功能。有時候很羨慕國外的開源網站將程式碼貼出就會收到各種各樣的改進,使得專案功能更加強大。當然我也會逐步完善該專案。

首先專案中採用的jar包:

由於我畫蛇添腳的加入資料庫,使得程式增加了一定的工程量,當然其實專案主線完成,個人覺得就應該算ok了。

對於資料庫提取資料的類,DAO,DAOImpl等類這裡不再細說,因為大多數人都知道如何用資料庫提取資料。

專案中所有的類如上右:

 

本人採用的是win8系統進行程式設計,不知是不是這個原因攝像頭能夠亮,但是畫面就是出不來,這就是專案目前需要除錯的地方。等有時間我再xp上除錯一下.

攝像頭拍照書寫方式與網上主流寫法一致(借鑑):

button.addActionListener(new ActionListener() {// 拍照功能
	public void actionPerformed(ActionEvent arg0) {

	FrameGrabbingControl fgc = (FrameGrabbingControl) player
				.getControl("javax.media.control.FrameGrabbingControl");
	buffer = fgc.grabFrame();
	bufferToImage = new BufferToImage(
			(VideoFormat) buffer.getFormat());
	image = bufferToImage.createImage(buffer);
	picPanel.setImage(image);
	String sclass = stuClass.getSelectedItem()
			.toString().trim();
	String sno = stuNo.getText().toString().trim();
	String sname = stuName.getText().toString().trim();
	flag = "E:\\" + sname + "_"
			+ System.currentTimeMillis() + ".jpg";
	if (ImageUtil.checkflag(sclass, sno, sname)) {// 檢查資料
		ImageUtil.saveImage(image, flag);// 儲存圖片並防止
		}
	}
});

其中驅動程式碼為:

captureDeviceInfo = CaptureDeviceManager
				.getDevice("vfw:Microsoft WDM Image Capture (Win32):0"); // 這裡放置的是視訊驅動
		mediaLocator = new MediaLocator("vfw://0"); // 這裡是視訊地址


如此開啟攝像頭個人不是很理解,但是第一次完成需要攝像頭的功能讓給我的是一種挫敗感。我一直懷疑可以是win8平臺的問題,但是如果在xp上沒問題,那麼我的懷疑才能被證明。

關於excel的匯入匯出方法,在前面的章節中介紹過,而這裡我要用的解析excel的完整類就是前一章的類,這裡不再贅述。

參考地址:http://blog.csdn.net/trsli/article/details/17392943

專案中關於圖片儲存方式主要是方便呼叫資料是進行切割字串,並且可以在檔案中很容易找到照片的主人。

對於其他的處理這裡不需要多說:程式碼中由於有兩種資料提取方式,個人認為如果遮蔽掉資料庫,應該會顯得更加簡單,但是寫資料庫主要是考慮到資料備份的需要。

下面是主類詳細程式碼:

public class MainForm extends JFrame {
	private JTextField stuName;// 學生姓名
	private JTextField stuNo;// 學生學號
	private JTable messageLine;// 學生資訊列表
	private JComboBox stuClass;// 班級資訊下拉選單
	private ImagePanel picPanel = new ImagePanel();// 圖片展示區
	private Component comp;// 照片區域
	private Player player = null;
	private CaptureDeviceInfo captureDeviceInfo = null;
	private MediaLocator mediaLocator = null;
	private Buffer buffer = null;
	private BufferToImage bufferToImage = null;
	private Image image = null;
	private String flag = "no";
	private String[] classmessage;
	Object[][] p;
	String[] n = { "序號", "班級", "學號", "姓名", "頭像" };//這裡在匯入資料時可以動態獲取	private JPanel midpanel;
	private DefaultTableModel model;
	private final JFileChooser filechoose = new JFileChooser();

	public MainForm() {
		staticmodel();
		this.setTitle("學生資訊錄入系統");
		this.setSize(new Dimension(800, 600));
		/** --------------定製選單開始------------------ */
		MenuBar mb = new MenuBar();
		Menu caidan = new Menu("選單");
		MenuItem daoru = new MenuItem("匯入execl");
		MenuItem daobufen = new MenuItem("匯出當前資訊");
		MenuItem exit = new MenuItem("退出");
		caidan.add(daoru);
		caidan.add(daobufen);
		caidan.add(exit);

		daoru.addActionListener(new ActionListener() {// 匯入事件
					public void actionPerformed(ActionEvent arg0) {
						filechoose.setDialogTitle("選擇xls檔案");
						filechoose.setAcceptAllFileFilterUsed(false);
						filechoose.addChoosableFileFilter(new ExcelFileFilter(
								"xls"));
						int val = filechoose.showOpenDialog(MainForm.this);
						if (val == JFileChooser.APPROVE_OPTION) {
							String filepath = filechoose.getSelectedFile()
									.getAbsolutePath();
							p = new PoiUtil().getmessage(filepath);
							n = new PoiUtil().gettitles(filepath);
							System.out.println("p[0][0]"+p[0][0]);
							model.setDataVector(p, n);
							
						} else {
							System.out.println("取消資訊匯入");
						}
					}
				});
		daobufen.addActionListener(new ActionListener() {// 匯出資訊事件
					public void actionPerformed(ActionEvent arg0) {
						filechoose.setDialogTitle("儲存為");
						ExcelFileFilter filter = new ExcelFileFilter("xls");
						filechoose.setFileFilter(filter);
						int val = filechoose.showDialog(MainForm.this, "確定");
						if (val == filechoose.APPROVE_OPTION) {
							String filepath = filechoose.getSelectedFile()
									.getPath();
							String filename = filechoose.getSelectedFile()
									.getName();
							int nindex = filename.indexOf(".xls");
							FileOutputStream fos;
							try {
								if (nindex < 0) {
									filename = filename + ".xls";
									int nindex1 = filepath.lastIndexOf("\\");
									String filepath1 = filepath.substring(0,
											nindex1 + 1);
									filename=filepath1		+ filename;
								} else {
									filename=filechoose.getSelectedFile().getName();
								}
								System.out.println(p.length+"p"+"n"+n.length+""+filename);
								new PoiUtil().createxls(p, n, filename);
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
					}
				});

		exit.addActionListener(new ActionListener() {// 退出程式
					public void actionPerformed(ActionEvent arg0) {
						ImageUtil.exit(MainForm.this, player);
					}
				});
		mb.add(caidan);
		this.setMenuBar(mb);
		/** --------------定製選單結束------------------ */

		/** ------------新增攝像頭成像區域-------------- */
		JPanel npanel = new JPanel(new BorderLayout(40, 0));
		captureDeviceInfo = CaptureDeviceManager
				.getDevice("vfw:Microsoft WDM Image Capture (Win32):0"); // 這裡放置的是視訊驅動
		mediaLocator = new MediaLocator("vfw://0"); // 這裡是視訊地址
		DataSource ds = new DataSource();
		ds.setLocator(mediaLocator);
		JPanel cpanel = new JPanel();
		cpanel.setSize(160, 200);
		try {
			player = Manager.createRealizedPlayer(mediaLocator);
			player.start();
			if ((comp = player.getVisualComponent()) != null)// 這裡需要進行處理
				cpanel.add(comp);
			npanel.add(cpanel, BorderLayout.WEST);
			/** ----------- 攝像頭新增完成------------ */

			/** ------------資訊輸入區---------------- */
			JPanel rpan = new JPanel(new BorderLayout(0, 30));
			rpan.add(new JLabel("學生資訊輸入區", JLabel.CENTER), BorderLayout.NORTH);
			JPanel mpanel = new JPanel(new GridLayout(3, 1, 40, 10));
			// 1
			JLabel clabel = new JLabel("班    級:");
			stuClass = new JComboBox(classmessage);
			JPanel cpa = new JPanel(new BorderLayout(20, 0));
			cpa.add(clabel, BorderLayout.WEST);
			cpa.add(stuClass, BorderLayout.CENTER);
			stuClass.setEditable(true);
			// 2
			JLabel nolabel = new JLabel("學    號:");
			stuNo = new JTextField();
			JPanel cpa1 = new JPanel(new BorderLayout(20, 0));
			cpa1.add(nolabel, BorderLayout.WEST);
			cpa1.add(stuNo, BorderLayout.CENTER);
			// 3
			JLabel nlabel = new JLabel("姓    名:");
			stuName = new JTextField();
			JPanel cpa2 = new JPanel(new BorderLayout(20, 0));
			cpa2.add(nlabel, BorderLayout.WEST);
			cpa2.add(stuName, BorderLayout.CENTER);
			// 4
			mpanel.add(cpa);
			mpanel.add(cpa1);
			mpanel.add(cpa2);
			rpan.add(mpanel, BorderLayout.CENTER);
			// 5
			JPanel bpanel = new JPanel();
			JButton button = new JButton("拍照");
			JButton addstu = new JButton("新增");
			JButton prvestu = new JButton("上一位");
			JButton nextstu = new JButton("下一位");
			button.addActionListener(new ActionListener() {// 拍照功能
						public void actionPerformed(ActionEvent arg0) {

							FrameGrabbingControl fgc = (FrameGrabbingControl) player
									.getControl("javax.media.control.FrameGrabbingControl");
							buffer = fgc.grabFrame();
							bufferToImage = new BufferToImage(
									(VideoFormat) buffer.getFormat());
							image = bufferToImage.createImage(buffer);
							picPanel.setImage(image);
							String sclass = stuClass.getSelectedItem()
									.toString().trim();
							String sno = stuNo.getText().toString().trim();
							String sname = stuName.getText().toString().trim();
							flag = "E:\\" + sname + "_"
									+ System.currentTimeMillis() + ".jpg";
							if (ImageUtil.checkflag(sclass, sno, sname)) {// 檢查資料
								ImageUtil.saveImage(image, flag);// 儲存圖片並防止
							}
						}
					});

			addstu.addActionListener(new ActionListener() {// 新增功能
						public void actionPerformed(ActionEvent arg0) {
							//資料庫處理區
							StudentDao dao = new StudentDaoImpl();
							
							String sclass = stuClass.getSelectedItem()
									.toString().trim();
							String sno = stuNo.getText().toString().trim();
							String sname = stuName.getText().toString().trim();
							if (ImageUtil.checkflag(sclass, sno, sname)) {// 檢查資料
								if (ImageUtil.checkstuno(sno)) {
									dao.saveStudent(new Student(sno, sname,
											flag, sclass));
									p = ImageUtil.getdbArray(sclass);
									model.setDataVector(p, n);
								} else {
									JOptionPane.showMessageDialog(null,
											"學號已經存在!", "提示資訊",
											JOptionPane.ERROR_MESSAGE);
								}
							}
						}
					});
			prvestu.addActionListener(new ActionListener() {// 上一位
						public void actionPerformed(ActionEvent e) {
							if (p != null) {
								int row = messageLine.getSelectedRow();
								ListSelectionModel smodel = messageLine
										.getSelectionModel();
								if (row > 0) {
									row = row - 1;
									smodel.setSelectionInterval(row, row);
								}
								showmessage(row);
							}
						}
					});
			nextstu.addActionListener(new ActionListener() {// 下一位
						public void actionPerformed(ActionEvent e) {
							if (p != null) {
								int row = messageLine.getSelectedRow();
								ListSelectionModel smodel = messageLine
										.getSelectionModel();
								if (row >= 0 && row < p.length - 1) {
									row = row + 1;
									smodel.setSelectionInterval(row, row);
								}
								showmessage(row);
							}
						}
					});
			bpanel.add(button);
			bpanel.add(addstu);
			bpanel.add(prvestu);
			bpanel.add(nextstu);
			rpan.add(bpanel, BorderLayout.SOUTH);
			npanel.add(rpan, BorderLayout.CENTER);
			/** -----------資訊介面完成-------------- */
		} catch (NoPlayerException e) {
			e.printStackTrace();
		} catch (CannotRealizeException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		this.add(npanel, BorderLayout.NORTH);
		/** -------中間皮膚佈局----------------- */
		midpanel = new JPanel(new BorderLayout(20, 20));
		picPanel.setBackground(Color.LIGHT_GRAY);
		midpanel.add(picPanel, BorderLayout.WEST);

		model = new DefaultTableModel(p, n);
		messageLine = new JTable(model);

		messageLine.setPreferredScrollableViewportSize(new Dimension(550, 30));
		JScrollPane scrollPane = new JScrollPane(messageLine);
		midpanel.add(scrollPane, BorderLayout.CENTER);
		/** ------中間皮膚結束------------------ */

		this.add(midpanel, BorderLayout.CENTER);
		// south
		JPanel spanel = new JPanel();
		JButton tuichu = new JButton("退出");
		tuichu.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				ImageUtil.exit(MainForm.this, player);
			}
		});
		/** 班級切換事件 */
		stuClass.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent e) {
				if (e.getStateChange() == ItemEvent.SELECTED) {
					String sclass = stuClass.getSelectedItem().toString();
					if (sclass.equals("請選擇班級")) {
						staticmodel();// 整理全部資料
						model.setDataVector(p, n);
					} else {
						p = ImageUtil.getdbArray(sclass);
						model.setDataVector(p, n);
					}
				}
			}
		});
		spanel.add(tuichu);
		// south end
		this.add(spanel, BorderLayout.SOUTH);
		this.pack();
		this.addWindowListener(new WindowAdapter() {// 關閉視窗事件
					public void windowClosing(WindowEvent e) {
						player.close();
						System.exit(0);
					}
				});
		this.setVisible(true);
	}

	/**動態顯示具體資訊*/
	public void showmessage(int row){
		Object[] msgs=p[row];
		stuName.setText(msgs[3].toString());
		stuNo.setText(msgs[2].toString());
		String imgPath = msgs[4].toString();  
		try {
			if(!imgPath.equals("no")){
				BufferedImage image = ImageIO.read(new FileInputStream(imgPath));
				picPanel.setImage(image);
			}else{
				picPanel=new ImagePanel();//沒有就進行初始化
			}
		} catch (FileNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}  
	}
	
	
	
	
	
	
	@Override
	public void paint(Graphics g) {// 繪圖
		super.paint(g);
		g.setColor(new Color(255, 0, 0));
		g.drawLine(0, 0, 100, 100);
	}

	public static void main(String[] args) {
		MainForm main = new MainForm();

	}

	private class ExcelFileFilter extends FileFilter {
		private String ext;

		public ExcelFileFilter(String ext) {
			this.ext = ext;
		}

		@Override
		public boolean accept(File file) {
			if (file.isDirectory()) {
				return true;
			}
			String fname = file.getName();
			int index = fname.lastIndexOf(".");
			if (index > 0 && index < fname.length() - 1) {
				String extension = fname.substring(index + 1).toLowerCase();
				if (extension.equals(ext)) {
					return true;
				}
				return false;
			}
			return false;
		}

		@Override
		public String getDescription() {
			if (ext.equals("xls")) {
				return "excel 檔案";
			}
			return "";
		}
	}
	//資料庫處理execl提取資料
	public void staticmodel() {
		StudentDao dao = new StudentDaoImpl();
		List<Student> stus = dao.listAllStudent();
		Set<String> set = new HashSet<String>();// 具有防止重複的功能
		p = new Object[stus.size()][5];
		for (int i = 0; i < stus.size(); i++) {
			int j = 0;
			p[i][j] = stus.get(i).getSid();
			p[i][j + 1] = stus.get(i).getStuClass();
			p[i][j + 2] = stus.get(i).getStuNo();
			p[i][j + 3] = stus.get(i).getStuName();
			p[i][j + 4] = stus.get(i).getFlagpic();
			set.add(stus.get(i).getStuClass());
		}
		// 獲取班級
		List<String> stuClassNames = new ArrayList<String>();

		stuClassNames.addAll(set);

		classmessage = new String[stuClassNames.size() + 1];
		classmessage[0] = "請選擇班級";
		for (int i = 0; i < stuClassNames.size(); i++) {
			classmessage[i + 1] = stuClassNames.get(i);
			System.out.println(stuClassNames.get(i));
		}
	}

以上程式碼是主視窗介面的程式碼,很長,但是內容很簡單。專案可以根據班級選擇而自動切換表格,在選單中有匯入和到處功能。資料為了測試方面才使用的如下資料。

專案開始時內部顯示的資料是資料庫中的資料,如果需要匯入資料選擇選單中的匯入,然後選擇.xls檔案即可。

專案功能基本實現,但是缺少較好的使用者體驗,這yeshiva我下一步需要完善的,也希望愛好學習的同行有興趣可以將程式碼copy去研究一下,並分享研究資訊。

下面是影象處理程式碼,其實在這裡真的符合類名稱的方法就第一個,處理圖片。不過個人將他作為工具類,應該不會功能無障礙。

public class ImageUtil {
	
	/**照片儲存方式,格式為jpeg*/
	public static void saveImage(Image image, String path) {
		BufferedImage bi = new BufferedImage(image.getWidth(null), image
				.getHeight(null), BufferedImage.TYPE_INT_RGB);
		Graphics2D g2 = bi.createGraphics();//繪製二維圖片
		g2.drawImage(image, null, null);
		FileOutputStream fos = null;
		try {
			fos = new FileOutputStream(path);
		} catch (FileNotFoundException e) { // TODO Auto-generated catch block
			e.printStackTrace();
		}
		JPEGImageEncoder je = JPEGCodec.createJPEGEncoder(fos);
		JPEGEncodeParam jp = je.getDefaultJPEGEncodeParam(bi);
		jp.setQuality(0.5f, false);
		je.setJPEGEncodeParam(jp);
		try {
			je.encode(bi);
			fos.close();
		} catch (ImageFormatException e) { 
			e.printStackTrace();
		} catch (IOException e) { 
			e.printStackTrace();
		}
	}
	/**退出提示操作*/
	public static void exit(JFrame source,Player player){
		int val=JOptionPane.showConfirmDialog(source,"真的要退出?", "提示資訊",0,1);
		if(val==JOptionPane.YES_OPTION){
			if(player!=null){
				player.close();
			}
			source.setVisible(false);
			System.exit(0);
		}
	}
	public static boolean checkstuno(String stuNo){
		StudentDao dao=new StudentDaoImpl();
		List<Student> students=dao.findStudentByStuno(stuNo);
		if(students.isEmpty()|| (students==null)){
			return true;
		}
		return false;
	}
	/**根據班級尋找資訊*/
	public static List<Student> findCalssStudents(String stuclass){
		StudentDao dao=new StudentDaoImpl();
		List<Student> students=dao.listStudent(stuclass);
		return students;
	}
	/**檢查輸入區資料*/
	public static boolean checkflag(String sclass,String sno,String sname){
		if(sclass.equals("請選擇班級")){
			JOptionPane.showMessageDialog(null, "請選擇班級","提示資訊",JOptionPane.ERROR_MESSAGE);
			return false;
		}
		if("".equals(sno)||sno==null){
			JOptionPane.showMessageDialog(null, "學號不能為空","提示資訊",JOptionPane.ERROR_MESSAGE);
			return false;
		}
		if("".equals(sname)||sname==null){
			JOptionPane.showMessageDialog(null, "姓名不能為空","提示資訊",JOptionPane.ERROR_MESSAGE);
			return false;
		}
		return true;
	}
	public static Object[][] getdbArray(String sclass){
		List<Student> stus=ImageUtil.findCalssStudents(sclass);
		System.out.println(stus.size()+"_success");
		Object[][] p =new Object[stus.size()][5];
		
		for(int i=0;i<stus.size();i++){
			int j=0;
				p[i][j]=stus.get(i).getSid();
				p[i][j+1]=stus.get(i).getStuClass();
				p[i][j+2]=stus.get(i).getStuNo();
				p[i][j+3]=stus.get(i).getStuName();
				p[i][j+4]=stus.get(i).getFlagpic();
		}
		return p;
	}

照片顯示panel.

/** 照片展示區域 */
public class ImagePanel extends Panel {
	public Image myimg = null;

	public ImagePanel() {
		setLayout(null);
		setSize(320, 240);
	}

	public void setImage(Image img) {
		this.myimg = img;
		repaint();
	}

	public void paint(Graphics g) {
		if (myimg != null) {
			g.drawImage(myimg, 10, 0, this);
		}
	}

這裡沒有關於資料庫的資訊,如果需要可以留言,畢竟資料庫不是專案的主線。

未完成情況展示,這裡需要相機除錯,照片能夠完整顯示出來,說明拍照存在問題。表格中選擇學生後,上面的學號姓名應該能夠相應的變化,為空白,確實不是很好看。


 匯出檔案,如到處2班的學生資訊在班級下拉選單中選擇2,選單中選擇匯出:

  這裡匯出到桌面:   

已經寫得夠多了,有興趣研究的人可以留言聯絡。

 

相關文章