我在國企當實習程序猿的日子

沒來以前,心目中的國企程序猿:


一、分一個單間寢室,或者兩我的一間也行。java

二、飯卡吃飯僅僅要幾元就能吃到外面十幾二十的東西。sql

三、工資沒外面IT的高,但是一個月也得個6,7K 吧?數據庫

四、生活安逸。天天就插插網線。從新啓動機子。安全

五、不用怕失業。oracle

六、既然工資不高,那麼福利待遇應該妥妥的吧。逢年過節送個幾千的應該沒問題吧。eclipse


來了以後,相應上面的想象:


一、我和一個哥們住在一個超級小的房間,裏面僅僅有(也僅僅能有)一張牀,大概2m x 3m。本身想一想吧,上下鋪,我在上鋪。牀質量很是差,一動就咯吱響,第一天晚上我和這哥們都沒睡着,3點的時候。我說哥們對不起啊。這牀不給力啊。ide

函數

二、每個月300飯補,呵呵。在動不動十幾二十一餐的一線城市哦,300。佈局

三、工資比想象中低個3,4K而已(大概兩千五),啊!post

拜託,指望工資已經僅僅想要6,7K了。你還能這麼刷下限。

四、一組算上我8我的,連領導都在幹活,都在加班,你說安逸?不是這陣子才這樣,我抱怨壓力是否是有點大了。一哥們無語了,對我呵呵,說我還沒見識過連續上班19天的時候。還沒見識半夜被打電話叫來DEBUG的時候。

五、這個鐵飯碗。仍是妥妥的。

六、福利據說在去年都取消了,可能和政策有關吧,過春節1000,元旦300。沒了。沒錯,沒了!這讓在騰訊某部門,36個月工資的他們無語了吧。


好吧,談談工做吧:

讓我熟悉java。eclipse和oracle!

好無語。。大二的東西,又要撿回來嗎?

而後說是想看看我水平,讓我寫個有JTable操做的應用。

好吧,oracle仍是第一次接觸哦,我愧對軟件學院。

==========================================吐槽到此結束====================================

========================================踏實幹活纔是王道===================================




功能:


一、書本錄入,包含:


編號 BOOK_ID

書名 BOOK_NAME

做者 BOOK_AUTHOR

出版社 BOOK_PUBLISH

入庫時間 Create_time

SQL> desc aa_book
 名稱                                      是否爲空? 類型
 ----------------------------------------- -------- ----------------------------

 BOOK_ID                                   NOT NULL NVARCHAR2(50)
 BOOK_NAME                                 NOT NULL VARCHAR2(100)
 BOOK_AUTHOR                               NOT NULL VARCHAR2(100)
 BOOK_PUBLISH                              NOT NULL VARCHAR2(100)
 CREATE_TIME                               NOT NULL VARCHAR2(50)


入庫的時候要看看是否是主鍵衝突。



二、書本查詢


能夠按編號,做者。出版社排序。


三、書本刪除


無腦刪除。


四、書本改動


改動的時候要看看是否是主鍵衝突。



界面:


大概長這個樣子:



項目免積分打包下載:http://download.csdn.net/download/xihuanqiqi/7325659

jar包都在裏面了。導入就能夠。




數據庫配置:


爲了怕有的孩子不大懂Oracle,我就免爲其可貴把本身的配置文檔共享下吧:

Ps:
首先請你安裝下Oracle,而後再安裝下PLSQL,而後進入PLSQL。菜單條 -> 文件 -> 新建 -> SQL窗體,輸入如下5.1到5.9的SQL命令就能夠。
個人Oracle版本號是9i。安裝圖解教程: http://hi.baidu.com/yuyuliangliang/item/11ffa027ba87220842634a8a
假設實在裝不懂,可以留言回覆,我基本天天都會上CSDN。

1. 確認PC已裝有Oracle10g。但是沒有password。沒法進入。

2. 卸載Oracle10g: 2.1 執行services.msc,中止4個和oracle有關的服務 2.2 開始->程序-> Oracle - OraDb_home1 -> Oracle Installation Products ->Universal Installer 2.3 從新啓動後刪除原來oracle所在文件夾 3. 安裝oracle9i D盤 默認-> 企業版 -> 通用 全局數據庫名:gt.sxtest SID:gt (操做系統環境變量) 數據庫文件文件夾:D:\oracle10G\oradata 字符集:缺省的 ZHS16GBK(方便跨平臺) server參數文件名稱:D:\oracle 10G\database\spfilegt.ora SYS口令:qq123qwe SYSTEM口令:qq123qwe 一開始123qwe,結果報錯:ORA-00988:缺乏或無效口令 這裏password長度有限制:口令長度不能小於7個字符第一個字符不能爲數字且全部字符中應該爲字母和數字混合 4. username 和 password oracle安裝會本身主動的生存sys用戶、scott用戶和system用戶。

(1)sys用戶是 超級用戶。具備最高權限,具備sysdba角色,有create database的權限。該用戶默認的password是 change_on_install; (2)system用戶是 管理操做員,權限也很是大。具備sysoper角色,沒有create database的權限。默認的password是 manager (3)通常來說。對數據庫維護。使用system用戶登陸就可以了。 (4)scott普通用戶,password是tiger。 5.數據庫正式開始建立:表空間+表 5.1 建立暫時表空間: CREATE TEMPORARY TABLESPACE AA_TEMP TEMPFILE 'D:\oracle10G\oradata\gt2\AA_TEMP.dbf' SIZE 32M AUTOEXTEND ON NEXT 32M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL; 解釋: SIZE 是文件大小 AUTOEXTEND ON 表示是否本身主動拓展 NEXT 表示文件滿了以後拓展的大小 MAXSIZE 表示 最大文件能拓展多大 EXTENT MANAGEMENT LOCAL表示本地表空間管理。

5.2 建立表空間: CREATE TABLESPACE AA LOGGING DATAFILE 'D:\oracle10G\oradata\gt2\aa.dbf' SIZE 32M AUTOEXTEND ON NEXT 32M MAXSIZE 2048M EXTENT MANAGEMENT LOCAL; 5.3 建立用戶並把表空間指定給用戶 CREATE USER AA_USER IDENTIFIED BY AA_PASS DEFAULT TABLESPACE AA TEMPORARY TABLESPACE AA_TEMP; 5.4 給用戶賦權 GRANT CREATE SESSION, CREATE ANY TABLE ,CREATE ANY VIEW, CREATE ANY INDEX,CREATE ANY PROCEDURE, ALTER ANY TABLE, ALTER ANY PROCEDURE, DROP ANY TABLE, DROP ANY VIEW , DROP ANY INDEX, DROP ANY PROCEDURE, SELECT ANY TABLE, INSERT ANY TABLE, UPDATE ANY TABLE ,DELETE ANY TABLE TO AA_USER; 5.5 給用戶賦予角色 GRANT CONNECT ,RESOURCE, DBA TO AA_USER; 取消授予角色;revoke dba from AA_USER; 5.6 建表 CREATE TABLE AA_BOOK( book_id varchar2(50) not null, book_name varchar2(100) not null, book_author varchar2(100) not null, book_publish varchar2(100) not null, create_time varchar2(50) default to_char(sysdate,'yyyy-MM-d HH:mm:ss') not null, constraint pk_book primary key (book_id) ) tablespace AA 5.7 插入數據 insert into aa_book(book_id,book_name,book_author,book_publish,create_time) values('1ABBC1','一本書','一個做者','一家出版社','2014-05-06') 說兩點: 1.不能帶';',不然會提示無效字符 2.字符串用單引號,而不能用雙引號




這就是配置文檔了,假設有人想實現ID自增,相似MySQL和MSSQL那樣,可以這麼操做(注意下BOOK_ID已經變成了number類型):
5.1
 建立暫時表空間:
 CREATE TEMPORARY TABLESPACE AA_TEMP
	TEMPFILE 'D:\oracle10G\oradata\gt2\AA_TEMP.dbf'
	SIZE 32M
	AUTOEXTEND ON
	NEXT 32M MAXSIZE 2048M
	EXTENT MANAGEMENT LOCAL;
	
 解釋:
	SIZE 是文件大小
	AUTOEXTEND ON  表示是否本身主動拓展
	NEXT 表示文件滿了以後拓展的大小
	MAXSIZE 表示 最大文件能拓展多大
	EXTENT MANAGEMENT LOCAL表示本地表空間管理。
 
5.2
 建立表空間:
 CREATE TABLESPACE AA

	LOGGING
	DATAFILE 'D:\oracle10G\oradata\gt2\aa.dbf'

	SIZE 32M
	AUTOEXTEND ON
	NEXT 32M MAXSIZE 2048M
	EXTENT MANAGEMENT LOCAL;

5.3
 建立用戶並把表空間指定給用戶
	CREATE USER AA_USER IDENTIFIED BY AA_PASS

	DEFAULT TABLESPACE AA

	TEMPORARY TABLESPACE AA_TEMP;

	
5.4 
 給用戶賦權
 GRANT 
 CREATE SESSION, CREATE ANY TABLE ,CREATE ANY VIEW, CREATE ANY INDEX,CREATE ANY PROCEDURE,
 ALTER ANY TABLE, ALTER ANY PROCEDURE,
 DROP ANY TABLE, DROP ANY VIEW , DROP ANY INDEX, DROP ANY PROCEDURE,
 SELECT ANY TABLE, INSERT ANY TABLE, UPDATE ANY TABLE ,DELETE ANY TABLE
 TO AA_USER;
 
5.5
 給用戶賦予角色
 GRANT 
 CONNECT ,RESOURCE, DBA TO AA_USER;
 
 取消授予角色;revoke dba from AA_USER;

5.6
 建表
 CREATE TABLE AA_BOOK(
	book_id number(10,0) not null,
	book_name varchar2(100) not null,
	book_author varchar2(100) not null,
	book_publish varchar2(100) not null,
	create_time varchar2(50) default to_char(sysdate,'yyyy-MM-d HH:mm:ss') not null,
	constraint pk_book primary key (book_id)
	)
	tablespace AA

5.7
 創建序列
 CREATE SEQUENCE emp_sequence
	 INCREMENT BY 1
	 START WITH 1
	 NOMAXVALUE
	 NOCYCLE
	 NOCACHE

	以上代碼完畢了一個序列(sequence)的創建過程,名稱爲emp_sequence
	範圍是從1開始到無限大(無限大的程度是由你機器決定的),nocycle 是決定不循環
	假設你設置了最大值那麼你可以用cycle 會使seq到最大以後循環.
	對於nocache順便說一下假設你給出了cache值那麼系統將本身主動讀取你的cache值大小個seq
		
5.8
 創建觸發器 - 實現自增ID
 
 CREATE OR REPLACE TRIGGER AA_INSERT_TRIGGER
 BEFORE INSERT ON AA_BOOK
 FOR EACH ROW
 
 BEGIN
        SELECT emp_sequence.nextval into :new.book_id from dual;
 END;

 

5.9
 插入數據
insert into aa_book(book_name,book_author,book_publish,create_time) values('一本書','一個做者','一家出版社','2014-05-06')





對我來講的項目亮點:


一、JTable 中實現 「刪除」button和「編輯」button,這個很是屌。不是嗎。


二、Oracle鏈接代碼(曾經沒接觸過哦。因此比較新奇)。


三、JTable 配合 DefaultTableModel,清空數據啊。加入數據啊,都是曾經沒搞過的。


四、父窗體和模態窗體的研究:

	這個長知識了,原來JFrame不具有模態窗體的條件:
		
		//Window類的構造:
		Window(GraphicsConfiguration gc){} //Frame和JFrame採用了這個構造方法
		
		//如下這三個構造方法才幹拓展出模態窗體。因爲它們指定了一個Frame或Window做爲其所有者
		Window(Frame owner){}
		Window(Window owner){}
		Window(Window owner, GraphicsConfiguration gc){}
		
	因此要改用JDialog!
	
	Dialog繼承的是Window類。它的構造例如如下:
	public Dialog(Frame owner, String title, boolean modal, GraphicsConfiguration gc) {
		super(owner, gc); //重點在這裏,因此它可以設置模態 
		this.title = title;
		this.modal = modal;
		setFocusTraversalPolicy(KeyboardFocusManager.getCurrentKeyboardFocusManager().getDefaultFocusTraversalPolicy());
	}

	JFrame和它的父類Frame的構造:
	public Frame(String title, GraphicsConfiguration gc) {
		super(gc); //採用了Window的第一種構造
		init(title, gc);
	}

五、對精簡代碼的一些小感悟:


5.1 同一個功能儘量多封裝在一個函數:


我把JRadioButton部分代碼,放到刷新JTable的函數中:
	用一個推斷做爲一個分支:
			if(sql.equals(SELECT_ALL_SQL)){
				String postfix = null;
				if(idRB.isSelected()){
					postfix = " order by book_id";
				}else if(authorRB.isSelected()){
					postfix = " order by book_author";
				}else if(publishRB.isSelected()){
					postfix = " order by book_publish";
				}
				sql += postfix;
			}
這樣子很是煩,因爲出現很多次呢,因此封裝成getPostfix(),每次:SQL+=getPostfix()就能夠:
	/*
	 * 獲取排序後綴字符串:order by xx 返回值爲String
	 */
	private String getPostfix() {
		String postfix = null;
		if (idRB.isSelected()) {
			postfix = " order by book_id";
		} else if (authorRB.isSelected()) {
			postfix = " order by book_author";
		} else if (publishRB.isSelected()) {
			postfix = " order by book_publish";
		}
		return postfix;
	}

5.2 用try - catch來幫助作一些推斷:


	在錄入的時候。假設數據庫中已有主鍵,try會報錯。

此時,咱們把報錯信息省略。 catch (SQLException e) { // TODO Auto-generated catch block //e.printStackTrace(); } 因爲報錯看起來不漂亮。 而後因爲update失敗,返回的影響行數就 不是 > 0因此就能推斷出update失敗。

類似。 if(DBHelper.update(sql, pras) > 0 ){ JOptionPane.showMessageDialog(null, "錄入成功!"); reflashTableData(SELECT_ALL_SQL,null); }else{ JOptionPane.showMessageDialog(null, "書本編號已存在。", "錯誤哦~", JOptionPane.ERROR_MESSAGE); }


5.3 去掉一些傻逼邏輯:


比方說,table更新得到焦點:
	這是以前的代碼:
	 //默認狀況焦點放到最後一行。除非指定focusOnRowIndex
	int allRowsCount = table.getRowCount();
	if(focusOnRowIndex == -1){
		table.requestFocus();
		table.setRowSelectionInterval(allRowsCount-1, allRowsCount-1);//最後一行得到焦點
	}else{
		table.requestFocus();
		if(allRowsCount-1 + 1  == focusOnRowIndex){//假設是最後一行
			table.setRowSelectionInterval(allRowsCount-1, allRowsCount-1);//最後一行得到焦點
		}else
			table.setRowSelectionInterval(focusOnRowIndex, focusOnRowIndex);//選中那一行得到焦點
	}
	
	這是以後的代碼!

: int allRowsCount = table.getRowCount(); table.requestFocus(); if(focusOnRowIndex == -1 || (allRowsCount-1 + 1) == focusOnRowIndex) table.setRowSelectionInterval(allRowsCount-1, allRowsCount-1); else table.setRowSelectionInterval(focusOnRowIndex, focusOnRowIndex);


5.4 一個函數控制不要超過40行:


一個函數假設太多行,就分幾個寫。
比方說個人initUI(),要實現兩個panel的界面:searchPanel和inputPanel,
寫在一塊兒就太長了,因而我就: initSearchPanel() 和 initInputPanel()
而後再initUI()中調用這兩個函數就行了。



5.5 try catch 的東西可以寫在一塊兒:


比方:
		try{
			//語句塊A
		}catch{
			
		}
		
		try{
			//語句塊B
		}catch{
			
		}   
		
		寫成:
		try{
			//語句塊A
			//語句塊B
		}catch{
			
		}

5.6 加凝視:


		這個要考慮清楚什麼叫精簡代碼,首先凝視不算代碼量;
		其次。凝視能幫人更好的閱讀代碼,也和咱們精簡代碼的指望是一致的。
		
		基本作到每個函數前面有主要的凝視,如:
		/*
		 * 這個函數是幹嗎用的!

*/ private void test(){ }




代碼:


事實上不建議直接看代碼,儘管我每個函數都有凝視。但是依然很是長很是煩。

建議把項目下載(免積分下載哦),而後導入,而後再略微看看。

假設我有什麼講得不清楚。或者某段代碼不明確,可以留言。我都會回覆的。



DBHelper.java:

這個數據庫操做全集成在這裏了。

package com.gtsx;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;


public class DBHelper {
	//數據庫驅動對象
	public static final String DRIVER="oracle.jdbc.driver.OracleDriver";
	
	//鏈接字符串
	public static final String URL="jdbc:oracle:thin:@localhost:1521:gt2";
	
	//Username
	public static final String USER="system";
	
	//Password
	public static final String PWD="qq123qwe";
	
	
	private static Connection con=null; //數據庫鏈接對象
	private static PreparedStatement ps=null;  //預編譯對象
	private static ResultSet rs=null;          //結果集 
	private static DataSource source=null; //數據源對象
	
	//獲取鏈接對象
	public static Connection getConnection(){
		try {
			Class.forName(DRIVER);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			con=DriverManager.getConnection(URL,USER,PWD);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return con;
	}
	
	//更新。插入,刪除
	public static int update(String sql,String... pras){
		int resu=0;
		if(con == null){
			con=getConnection();
		}
		try {
			ps=con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
			if(pras != null){
				for(int i=0;i<pras.length;i++){
					ps.setString(i+1,pras[i]);
				}
			}
			resu=ps.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			//e.printStackTrace();
		}
		finally{
			//closeAllObject();
		}
		return resu;
	}
	
	//查詢
	public static ResultSet query(String sql,String... pras){
		if(con == null){
			con=getConnection();
		}
		try {
			ps=con.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);

			if(pras!=null)
				for(int i=0;i<pras.length;i++){
					ps.setString(i+1, pras[i]);
				}
			
			rs=ps.executeQuery();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return rs;
	}
	
	
	//關閉所有對象
	public static void closeAllObject(){
		if(rs!=null){
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
			
		if(ps!=null){
			try {
				ps.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		if(con!=null){
			try {
				con.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
}




GTSX_Text1.java:

主要功能都在這裏。

package com.gtsx;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

import java.sql.*;
import java.text.SimpleDateFormat;

//第三方控件
import hysun.util.DateChooser;
import java.util.Calendar;

public class GTSX_Text1 {
	public static void main(String args[]) {
		new MainFrame();
	}
}

class MainFrame extends JFrame implements ActionListener {

	public MainFrame() {
		super("書本入庫管理系統");

		// 初始化 - UI
		contentPane = this.getContentPane();
		FlowLayout fl = new FlowLayout();
		fl.setHgap(20);// 橫向間距20像素
		
		contentPane.setLayout(fl);

		initSearchPanel();// 搜索顯示面板
		initInputPanel(); // 書本入庫信息錄入面板

		// 初始化菜單條
		initMenuBar();

		// 初始化表格數據
		reflashTableData(SELECT_ALL_SQL);

		// 設置 大小 & 顯示位置
		initHeightAndWidthAndPos();
		this.setSize(width, height);
		this.setLocation(xPos, yPos);
		this.setVisible(true);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);

	}

	/*
	 * 初始化UI - SearchPanel
	 */
	private void initSearchPanel() {
		// 初始化UI - searchPanel
		searchPanel = new JPanel();
		contentPane.add(searchPanel, BorderLayout.CENTER);
		
		searchPanel.setLayout(bag);

		JLabel label1 = new JLabel("請輸入書名:");
		goBtn = new JButton("查詢");
		goBtn.addActionListener(this);
		text = new JTextField(25);

		BG = new ButtonGroup();
		idRB = new JRadioButton("按書本編號排序");
		authorRB = new JRadioButton("按做者排序");
		publishRB = new JRadioButton("按出版社排序");
		BG.add(idRB);
		BG.add(authorRB);
		BG.add(publishRB);
		idRB.addActionListener(this);
		authorRB.addActionListener(this);
		publishRB.addActionListener(this);
		
		idRB.setSelected(true);// 默認選中按書本編號查詢

		// 初始化UI - searchPanel - table
		table = new JTable();

		scrollPane = new JScrollPane();
		scrollPane.setViewportView(table);
		scrollPane.setPreferredSize(new Dimension(500, 400));

		setCons(0, 3, 4, 3);
		searchPanel.add(scrollPane, c);

		setCons(0, 0, 1, 1);
		searchPanel.add(label1, c);

		setCons(1, 0, 2, 1);
		searchPanel.add(text, c);

		setCons(0, 1, 1, 1);
		searchPanel.add(idRB, c);

		setCons(1, 1, 1, 1);
		searchPanel.add(authorRB, c);

		setCons(2, 1, 1, 1);
		searchPanel.add(publishRB, c);

		setCons(3, 0, 1, 1);
		searchPanel.add(goBtn, c);
	}

	/*
	 * 初始化UI - inputPanel
	 */
	private void initInputPanel() {
		inputPanel = new JPanel();
		contentPane.add(inputPanel, BorderLayout.EAST);
		inputPanel.setLayout(bag);

		JLabel lb0 = new JLabel("書本編碼:");
		setCons(0, 0, 1, 1);
		inputPanel.add(lb0, c);

		book_idTF = new JTextField(10);
		setCons(1, 0, 1, 1);
		inputPanel.add(book_idTF, c);

		JLabel lb2 = new JLabel("書名:");
		setCons(0, 1, 1, 1);
		inputPanel.add(lb2, c);

		book_nameTF = new JTextField(10);
		setCons(1, 1, 1, 1);
		inputPanel.add(book_nameTF, c);

		JLabel lb3 = new JLabel("做者:");
		setCons(0, 2, 1, 1);
		inputPanel.add(lb3, c);

		book_authorTF = new JTextField(10);
		setCons(1, 2, 1, 1);
		inputPanel.add(book_authorTF, c);

		JLabel lb5 = new JLabel("入庫時間:");
		setCons(0, 3, 1, 1);
		inputPanel.add(lb5, c);

		book_dateTF = new JTextField(10);
		setCons(1, 3, 1, 1);
		inputPanel.add(book_dateTF, c);

		JButton select_date_btn = new JButton("選擇日期");
		setCons(2, 3, 1, 1);
		inputPanel.add(select_date_btn, c);

		select_date_btn.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				dc.setLocationRelativeTo(book_dateTF);
				dc.setVisible(true);
				Calendar cal = dc.getSelectedDate();
				if (cal != null) {
					book_dateTF.setText(FORMATTER.format(cal.getTime()));
				}
			}

		});

		JLabel lb4 = new JLabel("出版社:");
		setCons(0, 4, 1, 1);
		inputPanel.add(lb4, c);

		String nations[] = { "廣鐵出版社", "工業出版社", "湖南出版社", "賣萌出版社" };
		book_publishCB = new JComboBox(nations);
		book_publishCB.setMaximumSize(new Dimension(115, 20));
		book_publishCB.setMinimumSize(new Dimension(115, 20));
		book_publishCB.setPreferredSize(new Dimension(115, 20));

		setCons(1, 4, 1, 1);
		inputPanel.add(book_publishCB, c);

		inputBtn = new JButton("錄入");
		inputBtn.addActionListener(this);
		setCons(1, 5, 1, 1);
		inputPanel.add(inputBtn, c);
	}

	/*
	 * GridBird 網格佈局輔助函數
	 */
	public void setCons(int x, int y, int width, int height) {
		c.weightx = 1;
		c.weighty = 1;
		c.gridheight = height;
		c.gridwidth = width;
		c.gridx = x;
		c.gridy = y;
	}

	/*
	 * 初始化菜單條
	 */
	private void initMenuBar() {
		// TODO Auto-generated method stub
		menuBar = new JMenuBar();
		menu = new JMenu("文件");
		exitItem = new JMenuItem("退出");
		//addBookItem.addActionListener(this);
		exitItem.addActionListener(this);
		//menu.add(addBookItem);
		menu.add(exitItem);
		menuBar.add(menu);
		this.setJMenuBar(menuBar);
	}

	/*
	 * 刷新表格數據 - 重載 1
	 */
	private void reflashTableData(String sql, String... pras) {
		reflashTableData(sql, -1, pras);
	}

	/*
	 * 刷新表格數據 - 重載2 int focusOnRowIndex; 是說明下要哪一行得到焦點。

-1表示默認狀況。最後一行 */ private void reflashTableData(String sql, int focusOnRowIndex, String... pras) { // 清空JTable if (dtm != null) { dtm.setRowCount(0); } // 沒有搜索條件就全排,默認加上order by xx if (sql.equals(SELECT_ALL_SQL)) { sql += getPostfix(); } ResultSet rs = DBHelper.query(sql, pras); fillCellData(rs);// 填充cellData數據 String[] columnNames = { "編號", "書名", "做者", "出版社", "入庫時間", "DEL", "Edit" }; dtm = new myTablemodel(cellData, columnNames); table.setModel(dtm); // 刪除按鈕 this.table.getColumnModel().getColumn(delColumnIndex).setCellEditor( new MyDelButtonEditor(this.table)); this.table.getColumnModel().getColumn(delColumnIndex).setCellRenderer( new MyButtonRender("Del")); // 編輯按鈕 this.table.getColumnModel().getColumn(editColumnIndex).setCellEditor( new MyEditButtonEditor(this.table, this)); this.table.getColumnModel().getColumn(editColumnIndex).setCellRenderer( new MyButtonRender("Edit")); this.table.setRowHeight(25); // 設置行焦點,默認最後一行,假設UI有操做就當前行 int allRowsCount = table.getRowCount(); table.requestFocus(); if (focusOnRowIndex == -1 || (allRowsCount - 1 + 1) == focusOnRowIndex) table.setRowSelectionInterval(allRowsCount - 1, allRowsCount - 1); else table.setRowSelectionInterval(focusOnRowIndex, focusOnRowIndex); } /* * 獲取排序後綴字符串:order by xx 返回值爲String */ private String getPostfix() { String postfix = null; if (idRB.isSelected()) { postfix = " order by book_id"; } else if (authorRB.isSelected()) { postfix = " order by book_author"; } else if (publishRB.isSelected()) { postfix = " order by book_publish"; } return postfix; } /* * 獲取JTable 的 CellData 填充CellData的數據 */ private void fillCellData(ResultSet rs) { int rowCount = 0; try { columnNumber = rs.getMetaData().getColumnCount() + 2;// 加一個編輯一個刪除 rs.last(); rowCount = rs.getRow(); if (rowCount > 0) { cellData = new Object[rowCount][columnNumber]; } else { cellData = new Object[1][columnNumber]; cellData[0][0] = "查無數據"; } rs.beforeFirst(); // 給cellData賦值 if (rs != null) { int i = 0; while (rs.next()) { for (int j = 0; j < columnNumber - 2; j++) { cellData[i][j] = rs.getObject(j + 1); } i++; } } } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } /* * 初始化UI的長寬和初始顯示位置 */ private void initHeightAndWidthAndPos() { // TODO Auto-generated method stub Toolkit tk = Toolkit.getDefaultToolkit(); Dimension screenSize = tk.getScreenSize(); height = screenSize.height * 2 / 3; width = screenSize.width * 3 / 4; xPos = (screenSize.width - width) / 2; yPos = (screenSize.height - height) / 2; } /* * 響應按鈕監聽函數 (non-Javadoc) * * @see * java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if (e.getSource() == goBtn) { String searchText = this.text.getText(); if (searchText == "" || searchText.equals("")) { reflashTableData(SELECT_ALL_SQL, null); } else { String postfix = null; if (idRB.isSelected()) { postfix = " order by book_id"; } else if (authorRB.isSelected()) { postfix = " order by book_author"; } else if (publishRB.isSelected()) { postfix = " order by book_publish"; } String sql = "select * from aa_book where book_id = '" + searchText + "'" + postfix; // System.out.println(sql); reflashTableData(sql, null); } } if (e.getSource() == inputBtn) { String book_id_text = this.book_idTF.getText(); String book_name_text = this.book_nameTF.getText(); String book_author_text = this.book_authorTF.getText(); String book_publish_text = this.book_publishCB.getSelectedItem() .toString(); String book_date_text = this.book_dateTF.getText(); if (book_name_text.equals("") || book_author_text.equals("") || book_publish_text.equals("") || book_date_text.equals("")) { JOptionPane.showMessageDialog(null, "請您填寫完整的數據!

", "錯誤哦~", JOptionPane.ERROR_MESSAGE); } else { String sql = "insert into aa_book(book_id,book_name,book_author,book_publish,create_time) values(?,?,?,?

,?

)"; String pras[] = { book_id_text, book_name_text, book_author_text, book_publish_text, book_date_text }; if (DBHelper.update(sql, pras) > 0) { JOptionPane.showMessageDialog(null, "錄入成功!"); reflashTableData(SELECT_ALL_SQL, null); } else { JOptionPane.showMessageDialog(null, "書本編號已存在。", "錯誤哦~", JOptionPane.ERROR_MESSAGE); } } } if(e.getSource() == this.exitItem){ int returnVal = JOptionPane.showConfirmDialog(null, "肯定離開?", "您點擊了關閉按鈕", JOptionPane.YES_NO_OPTION); if(returnVal == JOptionPane.YES_OPTION){ this.dispose(); System.exit(0); } } if(e.getSource() == idRB || e.getSource() == authorRB || e.getSource() == publishRB){ reflashTableData(SELECT_ALL_SQL, null); } } /* * 本身定義類myTablemodel 本身定義的DefaultTableModel 方便控制是否可編輯等屬性 */ class myTablemodel extends DefaultTableModel { myTablemodel(Object[][] cells, String[] colnames) { super(cells, colnames); } public boolean isCellEditable(int row, int column) { if (column == delColumnIndex || column == editColumnIndex) { return true; } else { return false; } } } /* * 本身定義類MyDelButtonEditor 用來放在JTable中 */ public class MyDelButtonEditor extends DefaultCellEditor { private static final long serialVersionUID = -6546334664166791132L; private JPanel panel; private JButton button; public MyDelButtonEditor(JTable table) { // TODO Auto-generated constructor stub // DefautlCellEditor有此構造器,需要傳入一個,但這個不會使用到。直接new一個就能夠。 super(new JTextField()); // 設置點擊幾回激活編輯。 this.setClickCountToStart(1); this.initButton(table); this.initPanel(); // 加入按鈕。

this.panel.add(this.button); } private void initButton(final JTable table) { this.button = new JButton(); // 設置按鈕的大小及位置。 this.button.setBounds(0, 0, 50, 15); // 爲按鈕加入事件。這裏僅僅能加入ActionListner事件,Mouse事件無效。

this.button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { int res = JOptionPane.showConfirmDialog(null, "確認刪除?", "請肯定是否刪除該行數據", JOptionPane.YES_NO_OPTION); if (res == JOptionPane.YES_OPTION) { int rowIndex = table.getSelectedRow(); Object book_id = table.getModel().getValueAt(rowIndex, 0); // System.out.println(book_id.toString()); String sql = "delete from aa_book where book_id = '" + book_id.toString() + "'"; if (DBHelper.update(sql, null) > 0) { JOptionPane.showMessageDialog(null, "刪除成功"); reflashTableData(SELECT_ALL_SQL, rowIndex); } } // 觸發取消編輯的事件,不會調用tableModel的setValue方法。

MyDelButtonEditor.this.fireEditingCanceled(); // 這裏可以作其餘操做。

// 可以將table傳入,經過getSelectedRow,getSelectColumn方法獲取到當前選擇的行和列及其餘操做等。 } }); } private void initPanel() { this.panel = new JPanel(); // panel使用絕對定位。這樣button就不會充滿整個單元格。 this.panel.setLayout(null); } /** * 這裏重寫父類的編輯方法。返回一個JPanel對象就能夠(也可以直接返回一個Button對象,但是那樣會填充滿整個單元格) */ @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { // 僅僅爲按鈕賦值就能夠。

也可以做其餘操做。 this.button.setText(value == null ?

"DEL" : String.valueOf(value)); return this.panel; } /** * 重寫編輯單元格時獲取的值。假設不重寫,這裏可能會爲按鈕設置錯誤的值。 */ @Override public Object getCellEditorValue() { return this.button.getText(); } } /* * 本身定義類MyEditButtonEditor 用來放在JTable中 */ public class MyEditButtonEditor extends DefaultCellEditor { private static final long serialVersionUID = -6546334664166791132L; private JPanel panel; private JButton button; public MyEditButtonEditor(JTable table, MainFrame mf) { // TODO Auto-generated constructor stub // DefautlCellEditor有此構造器,需要傳入一個,但這個不會使用到。直接new一個就能夠。 super(new JTextField()); // 設置點擊幾回激活編輯。 this.setClickCountToStart(1); this.initButton(table, mf); this.initPanel(); // 加入按鈕。 this.panel.add(this.button); } private void initButton(final JTable table, final MainFrame mf) { this.button = new JButton(); // 設置按鈕的大小及位置。 this.button.setBounds(0, 0, 50, 15); // 爲按鈕加入事件。

這裏僅僅能加入ActionListner事件。Mouse事件無效。

this.button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { EditDialog ed = new EditDialog(mf); // 觸發取消編輯的事件,不會調用tableModel的setValue方法。 MyEditButtonEditor.this.fireEditingCanceled(); // 這裏可以作其餘操做。

// 可以將table傳入,經過getSelectedRow,getSelectColumn方法獲取到當前選擇的行和列及其餘操做等。 } }); } private void initPanel() { this.panel = new JPanel(); // panel使用絕對定位,這樣button就不會充滿整個單元格。 this.panel.setLayout(null); } /** * 這裏重寫父類的編輯方法。返回一個JPanel對象就能夠(也可以直接返回一個Button對象,但是那樣會填充滿整個單元格) */ @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { // 僅僅爲按鈕賦值就能夠。也可以做其餘操做。

this.button.setText(value == null ?

"DEL" : String.valueOf(value)); return this.panel; } /** * 重寫編輯單元格時獲取的值。

假設不重寫。這裏可能會爲按鈕設置錯誤的值。 */ @Override public Object getCellEditorValue() { return this.button.getText(); } } /* * 本身定義類EditDialog 用來放在改動書本信息 */ class EditDialog { private JTextField book_id_TF; private JTextField book_name_TF; private JTextField book_author_TF; private JTextField book_publish_TF; private JTextField book_date_TF; private JPanel panel; private JButton saveBtn; private String orgBookID; public EditDialog(JFrame father) { final JDialog jd = new JDialog(father, "編輯書本信息", true); panel = new JPanel(); Container jd_contentPane = jd.getContentPane(); jd_contentPane.setLayout(bag); TableModel tm = table.getModel(); int row = table.getSelectedRow(); orgBookID = tm.getValueAt(row, 0).toString(); JLabel lb0 = new JLabel("書本編碼:"); book_id_TF = new JTextField(20); book_id_TF.setText(tm.getValueAt(row, 0).toString()); JLabel lb1 = new JLabel("書名:"); book_name_TF = new JTextField(20); book_name_TF.setText(tm.getValueAt(row, 1).toString()); JLabel lb2 = new JLabel("做者:"); book_author_TF = new JTextField(20); book_author_TF.setText(tm.getValueAt(row, 2).toString()); JLabel lb3 = new JLabel("出版社:"); book_publish_TF = new JTextField(20); book_publish_TF.setText(tm.getValueAt(row, 3).toString()); JLabel lb4 = new JLabel("入庫日期:"); book_date_TF = new JTextField(20); book_date_TF.setText(tm.getValueAt(row, 4).toString()); // panel.setLayout(bag); setCons(0, 0, 1, 1); jd_contentPane.add(lb0, c); setCons(1, 0, 1, 1); jd_contentPane.add(book_id_TF, c); setCons(0, 1, 1, 1); jd_contentPane.add(lb1, c); setCons(1, 1, 1, 1); jd_contentPane.add(book_name_TF, c); setCons(0, 2, 1, 1); jd_contentPane.add(lb2, c); setCons(1, 2, 1, 1); jd_contentPane.add(book_author_TF, c); setCons(0, 3, 1, 1); jd_contentPane.add(lb3, c); setCons(1, 3, 1, 1); jd_contentPane.add(book_publish_TF, c); setCons(0, 4, 1, 1); jd_contentPane.add(lb4, c); setCons(1, 4, 1, 1); jd_contentPane.add(book_date_TF, c); saveBtn = new JButton("改動"); setCons(1, 5, 1, 1); jd_contentPane.add(saveBtn, c); saveBtn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { // TODO Auto-generated method stub String book_id = book_id_TF.getText(); String book_name = book_name_TF.getText(); String book_author = book_author_TF.getText(); String book_publish = book_publish_TF.getText(); String book_date = book_date_TF.getText(); // 請注意。。!

!!!!

。!

!。! // 這邊邏輯太多了。就偷懶,默認四個都不爲空都會改動吧 String sql = "update aa_book set book_id = ?, book_name = ?

, book_author = ? , book_publish = ?

, create_time = ?

where book_id = ?

"; String[] pras = { book_id, book_name, book_author, book_publish, book_date, orgBookID }; if (DBHelper.update(sql, pras) > 0) { JOptionPane.showMessageDialog(null, "改動成功!"); reflashTableData(SELECT_ALL_SQL, null); jd.dispose(); } else { JOptionPane.showMessageDialog(null, "書本編號衝突!

", "ERROR! 改動不成功!", JOptionPane.ERROR_MESSAGE); } } }); jd.setSize(400, 300); Toolkit tk = Toolkit.getDefaultToolkit(); Dimension screenSize = tk.getScreenSize(); height = screenSize.height * 1 / 3; width = screenSize.width * 1 / 4; int xPos = (screenSize.width - width) / 2; int yPos = (screenSize.height - height) / 2; jd.setLocation(xPos, yPos); jd.setVisible(true); } } private JPanel panel; private Container contentPane; private JPanel searchPanel; private JPanel inputPanel; private int height, width, xPos, yPos; private JMenuBar menuBar; private JMenu menu; private JMenuItem addBookItem; private JMenuItem exitItem; private JTable table; private Object[][] cellData; private JScrollPane scrollPane; private int columnNumber; private int defaultRowsNum; GridBagLayout bag = new GridBagLayout(); GridBagConstraints c = new GridBagConstraints(); private JButton goBtn; private JTextField text; private myTablemodel dtm = null; private JTextField book_idTF; private JTextField book_nameTF; private JTextField book_authorTF; private JComboBox book_publishCB; private JTextField book_dateTF; private JButton inputBtn; final DateChooser dc = new DateChooser(this, true); private static final SimpleDateFormat FORMATTER = new SimpleDateFormat( "yyyy-MM-dd"); private int delColumnIndex = 5; private int editColumnIndex = 6; private String SELECT_ALL_SQL = "select * from aa_book"; private ButtonGroup BG; private JRadioButton idRB; private JRadioButton authorRB; private JRadioButton publishRB; }




實現一個書本入庫管理系統,能夠:增刪改查!

MyButtonRender.java:

輔助類,用來調整JTable中的JButton屬性。

package com.gtsx;
import java.awt.Component;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;


public class MyButtonRender implements TableCellRenderer  
{  
    private JPanel panel;  
  
    private JButton button;  
  
    private String nameOfBtn;
    
    public MyButtonRender(String btnName)  
    {  
    	nameOfBtn = btnName;
    	
        this.initButton();  
  
        this.initPanel();  
  
        // 加入按鈕。

this.panel.add(this.button); } private void initButton() { this.button = new JButton(); // 設置按鈕的大小及位置。 this.button.setBounds(5, 2, 60, 20); // 在渲染器裏邊加入按鈕的事件是不會觸發的 // this.button.addActionListener(new ActionListener() // { // // public void actionPerformed(ActionEvent e) // { // // TODO Auto-generated method stub // } // }); } private void initPanel() { this.panel = new JPanel(); // panel使用絕對定位。這樣button就不會充滿整個單元格。 this.panel.setLayout(null); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { // 僅僅爲按鈕賦值就能夠。也可以做其餘操做。如繪背景等。 //this.button.setText(value == null ? "DEL" : String.valueOf(value)); this.button.setText(nameOfBtn); return this.panel; } }





emaster  關注信息安全的胖子
歡迎轉載,但轉載請註明地址:http://blog.csdn.net/emaste_r/article/details/25384691

相關文章
相關標籤/搜索