首页 > 代码库 > 我在国企当实习程序员的日子

我在国企当实习程序员的日子

没来之前,心目中的国企程序员:


1、分一个单间寝室,或者两个人一间也行。

2、饭卡吃饭只要几元就能吃到外面十几二十的东西。

3、工资没外面IT的高,但是一个月也得个6,7K 吧?

4、生活安逸,每天就插插网线,重启机子。

5、不用怕失业。

6、既然工资不高,那么福利待遇应该妥妥的吧,逢年过节送个几千的应该没问题吧。


来了之后,对应上面的想象:


1、我和一个哥们住在一个超级小的房间,里面只有(也只能有)一张床,大概2m x 3m,自己想想吧,上下铺,我在上铺,床质量很差,一动就咯吱响,第一天晚上我和这哥们都没睡着,3点的时候,我说哥们对不起啊,这床不给力啊。。

2、每个月300饭补,呵呵,在动不动十几二十一餐的一线城市哦,300。

3、工资比想象中低个3,4K而已(大概两千五),啊!拜托,期望工资已经只想要6,7K了,你还能这么刷下限。

4、一组算上我8个人,连领导都在干活,都在加班,你说安逸?不是这阵子才这样,我抱怨压力是不是有点大了,一哥们无语了,对我呵呵,说我还没见识过连续上班19天的时候。还没见识半夜被打电话叫来DEBUG的时候。

5、这个铁饭碗,还是妥妥的。

6、福利听说在去年都取消了,可能和政策有关吧,过年1000,元旦300。没了,没错,没了!这让在腾讯某部门,36个月工资的他们无语了吧。


好吧,谈谈工作吧:

让我熟悉java,eclipse和oracle!

好无语。。大二的东西,又要捡回来吗?

然后说是想看看我水平,让我写个有JTable操作的应用。

好吧,oracle还是第一次接触哦,我愧对软件学院。

==========================================吐槽到此结束====================================

========================================踏实干活才是王道===================================




功能:


1、书本录入,包括:


编号 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)


入库的时候要看看是不是主键冲突。



2、书本查询


能够按编号,作者,出版社排序。


3、书本删除


无脑删除。


4、书本修改


修改的时候要看看是不是主键冲突。



界面:


大概长这个样子:



项目免积分打包下载:http://download.csdn.net/download/xihuanqiqi/7321283

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,但是没有密码,无法进入。
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(方便跨平台)
	服务器参数文件名:D:\oracle 10G\database\spfilegt.ora
	
	SYS口令:qq123qwe
	SYSTEM口令:qq123qwe 
	
	一开始123qwe,结果报错:ORA-00988:缺少或无效口令
	这里密码长度有限制:口令长度不能小于7个字符第一个字符不能为数字且全部字符中应该为字母和数字混合
	
4. 用户名 和 密码
 oracle安装会自动的生存sys用户、scott用户和system用户。 
(1)sys用户是 超级用户,具有最高权限,具有sysdba角色,有create database的权限,该用户默认的密码是 change_on_install;
(2)system用户是 管理操作员,权限也很大。具有sysoper角色,没有create database的权限,默认的密码是 manager
(3)一般来讲,对数据库维护,使用system用户登录就可以了。
(4)scott普通用户,密码是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‘)





对我来说的项目亮点:


1、JTable 中实现 “删除”按钮和“编辑”按钮,这个很屌,不是吗。


2、Oracle连接代码(以前没接触过哦,所以比较新鲜)。


3、JTable 配合 DefaultTableModel,清空数据啊,添加数据啊,都是以前没搞过的。


4、父窗口和模态窗口的研究:

	这个长知识了,原来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、对精简代码的一些小感悟:


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:

这个数据库操作全集成在这里了。。

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:

实现一个书本入库管理系统,能够:增删改查!

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();
		contentPane.setLayout(new FlowLayout());

		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(4, 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("书本管理");
		addBookItem = new JMenuItem("加一本书");
		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 = http://www.mamicode.com/new Object[rowCount][columnNumber];>


MyButtonRender.java:

辅助类,用来调整JTable中的JButton属性。

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 =http://www.mamicode.com/= null ? "DEL" : String.valueOf(value));  >



emaster  关注信息安全的胖子
欢迎转载,但转载请注明地址:http://blog.csdn.net/emaste_r/article/details/25384691