一、分一個單間寢室,或者兩我的一間也行。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包都在裏面了。導入就能夠。
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.字符串用單引號,而不能用雙引號
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')
這個長知識了,原來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); }
我把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; }
在錄入的時候。假設數據庫中已有主鍵,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); }
比方說,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);
一個函數假設太多行,就分幾個寫。 比方說個人initUI(),要實現兩個panel的界面:searchPanel和inputPanel, 寫在一塊兒就太長了,因而我就: initSearchPanel() 和 initInputPanel() 而後再initUI()中調用這兩個函數就行了。
比方: try{ //語句塊A }catch{ } try{ //語句塊B }catch{ } 寫成: try{ //語句塊A //語句塊B }catch{ }
這個要考慮清楚什麼叫精簡代碼,首先凝視不算代碼量; 其次。凝視能幫人更好的閱讀代碼,也和咱們精簡代碼的指望是一致的。 基本作到每個函數前面有主要的凝視,如: /* * 這個函數是幹嗎用的!*/ 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