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

wzzkaifa wzzkaifa     2022-08-28     508

关键词:

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


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/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:oracle10Goradata 字符集:缺省的 ZHS16GBK(方便跨平台) server參数文件名称:D:oracle 10Gdatabasespfilegt.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:oracle10Goradatagt2AA_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:oracle10Goradatagt2aa.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:oracle10Goradatagt2AA_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:oracle10Goradatagt2aa.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 中实现 “删除”button和“编辑”button,这个非常屌。不是吗。


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:

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

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













































































在国企的日子(序言)

阿玲是我隔壁邻居的小孩,目前正在读高中。一天上午,我在书房正准备写点东西,但是整体框架还没想好,中间写写停停,时不时仰望着天花板出神。阿玲走进来,是又想找我借书看的,我的书架上总有三排,第一排是计算机... 查看详情

在国企的日子(第五章江湖)

 天下风云出我辈,一入江湖岁月催;皇图霸业谈笑中,不胜人生一场醉。任我行曾经说过,有人的地方就有恩怨,有恩怨就有江湖,人就是江湖。程序员的世界同样有江湖。这是我人生中第一次在程序员的世界接触江湖,若... 查看详情

review-反思当程序猿的小一年来

误打误撞进入这个行业,也算是缘分把,不到一年的时光里,剖析一下自己,别写了半天代码,学了一堆东西,不知道干嘛.反省一下.1.目标与知识库就目前在我看来,是想成为一名优秀的数据工程师,掌握全栈数据分析技术.技术链:  爬... 查看详情

高效程序猿的狂暴之路

不觉间已经工作六年,回忆第一天实习的场景历历在目、恍若昨日。六年已足以令很多人转管理、转产品、转測试、转行,也一定有人还在坚守着编码,仅仅因热爱。遇到过形形色色的经理、架构师、运维、性能工程师等等,还... 查看详情

在国企当程序员是什么体验?

...设置星标”优质文章,第一时间送达分享一篇网友在国企做研发的感受帖,题图与内容无关,不要留言问我要原图。前言2017年初,我通过一整天的笔试及面试加入一家(某一线城市国资委全资控股)某集... 查看详情

当程序员的那些狗日日子

作此文,祭奠我当程序员的那些狗日日子,并与所有仍在艰苦奋斗着的同行共勉。这里所说的是“我”当程序员的那些狗日日子,但我绝对没有说别人当程序员是狗日日子。在这里我也并没有贬低“程序员”这个职业和这个群体... 查看详情

一个屌丝程序猿的人生(七十)

  第二轮项目演示结束了,大家又回到了看视频学习的平淡日子。  值得一提的是,张建派的人自那以后,不仅没有再提过林萧玩猫腻的事,反而一个个都对林萧毕恭毕敬。  这倒是让林萧派的人开了眼,虽然林萧派的人... 查看详情

程序猿的十年—新猿农计划

目录 引言实习技术软件设计产品管理改变创新社会文化持续探索回顾分享 引言        新猿农计划,讲述的本人作为普通农村家庭大学毕业在IT行业中奔波磨炼的历程;从职场小白到职场老鸟的经历与思考。    ... 查看详情

一个屌丝程序猿的人生(一百一十七)

...办法。现在公司里王立新是他的狗腿子,刘舒婷又只是个实习的妹子,你说现在这个关头他想表现勤奋 查看详情

程序猿的内功修炼学好算法与数据结构

第1章当我们谈论算法的时候,我们在谈论什么?无论是BAT,还是FLAG,但凡有点儿水平的技术公司,面试都要面算法。为什么算法这么重要?在工作中,真的会使用算法吗?学了算法到底有什么用?当我们谈论算法的时候,我们... 查看详情

java程序猿的javascript学习笔记(1——理念)

计划按例如以下顺序完毕这篇笔记:Java程序猿的JavaScript学习笔记(1——理念)Java程序猿的JavaScript学习笔记(2——属性复制和继承)Java程序猿的JavaScript学习笔记(3——this/call/apply)Java程序猿的JavaScript学习笔记(4——this/闭... 查看详情

java程序猿的javascript学习笔记(9——jquery工具方法)

计划按例如以下顺序完毕这篇笔记: Java程序猿的JavaScript学习笔记(1——理念)Java程序猿的JavaScript学习笔记(2——属性复制和继承)Java程序猿的JavaScript学习笔记(3——this/call/apply)Java程序猿的JavaScript学习笔记(4——thi... 查看详情

java程序猿的javascript学习笔记(12——jquery-扩展选择器)

计划按例如以下顺序完毕这篇笔记:Java程序猿的JavaScript学习笔记(1——理念)Java程序猿的JavaScript学习笔记(2——属性复制和继承)Java程序猿的JavaScript学习笔记(3——this/call/apply)Java程序猿的JavaScript学习笔记(4——this/闭... 查看详情

一个十二年老程序猿的碎碎念h5牛牛程序出售

...你们想的那么好,反而挺悲催的,当时的同学们都不知道我在说些啥,另外我至今都不 查看详情

从苏宁电器到卡巴斯基(第二部)第12篇:我在卡巴的日子xii

目录灰色样本两个和灰色程序相关的Case远控工具年会X吉姆尼灰色样本在我们日常的分析工作中,除了我之前提到过的最常见的干净程序以及恶意程序以外,在这种看似“非黑即白”的世界里面,其实还存在着一种介于二者之间... 查看详情

从苏宁电器到卡巴斯基(第二部)第12篇:我在卡巴的日子xii

目录灰色样本两个和灰色程序相关的Case远控工具年会X吉姆尼灰色样本在我们日常的分析工作中,除了我之前提到过的最常见的干净程序以及恶意程序以外,在这种看似“非黑即白”的世界里面,其实还存在着一种介于二者之间... 查看详情

《程序猿的职业修养》读后感:说"不" and 说“是”

...不要说'试试看'。"还有一方面,作为一个初入行业的程序猿,我们有没有权利,应不应该说不(或是)呢,又该何时何地何事说”不(或是)“?这篇文章就解决此问题。      相信工作的人对此都会非... 查看详情

tw实习日记:第18天

  今天的bug没有那么多了,都是些小bug,一下就改好了。或者是接口那边数据返回的有问题,通知一下同事就ok了。主要今天是在赶功能进度,然而有一个功能模块需求里并没有写,实在是不知道要做成什么样子,真的是蛋疼... 查看详情