首页 > 代码库 > 我在国企当实习程序员的日子
我在国企当实习程序员的日子
没来之前,心目中的国企程序员:
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包都在里面了,导入即可。
数据库配置:
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(); } } } }
实现一个书本入库管理系统,能够:增删改查!
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