
2006年1月27日
這幾天用TimerTask作了個(gè)框架,擔(dān)心超過十萬條數(shù)據(jù)的時(shí)候速度變慢,其實(shí)每秒十萬次的運(yùn)行速度等到以后放在服務(wù)器上運(yùn)行應(yīng)該游刃有余吧,還不清楚,不過現(xiàn)在在我筆記本上運(yùn)行得還可以,內(nèi)存吃的很大,java就這毛病,程序員不能自由釋放內(nèi)存。1G內(nèi)存不夠用,我筆記本2G有分配不了,似乎虛擬內(nèi)存java用不了,沒仔細(xì)做過實(shí)驗(yàn)。
這幾天看新聞知道番茄花園作者被警方逮捕,樹大招風(fēng),槍打出頭鳥,很正常,從程序員的身份來講,盜版是要打擊的,不過我本身電腦里要付費(fèi)的軟件都是盜版的,很矛盾,呵呵。
實(shí)在太久沒寫servlet了,應(yīng)該至少1年了,那時(shí)候做了點(diǎn)皮毛,現(xiàn)在項(xiàng)目要求用到servlet的相關(guān)知識(shí),同時(shí)我在blogjava的bolg又開張了。學(xué)習(xí)的過程將記錄在我的blog中。對(duì)比了一下netbean和eclipse感覺用netbean編寫servlet程序方便些,eclipse用了幾年,但是還是感覺每次要找好相關(guān)的jar需要花費(fèi)太多時(shí)間,于是決定用netbean編寫了。
看看以下代碼:
將26個(gè)英文字母重復(fù)加了5000次,
String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart1=System.currentTimeMillis();
??String str ="";
??for(int i=0;i<times;i++)
??{
???str+=tempstr;
??}
??
??long lend1=System.currentTimeMillis();
??long time = (lend1-lstart1);
??System.out.println(time);
可惜我的計(jì)算機(jī)不是超級(jí)計(jì)算機(jī),得到的結(jié)果每次不一定一樣一般為 154735 左右。
也就是154秒。
我們?cè)倏纯匆韵麓a
String tempstr = "abcdefghijklmnopqrstuvwxyz";
?
??int times = 5000;
long lstart2=System.currentTimeMillis();
??StringBuffer sb =new? StringBuffer();
??for(int i=0;i<times;i++)
??{
???sb.append(tempstr);
???
??}
??long lend2=System.currentTimeMillis();
??long time2 = (lend2-lstart2);
??System.out.println(time2);
?得到的結(jié)果為 16 有時(shí)還是 0
所以結(jié)論很明顯,StringBuffer 的速度幾乎是String 上萬倍。當(dāng)然這個(gè)數(shù)據(jù)不是很準(zhǔn)確。因?yàn)檠h(huán)的次數(shù)在100000次的時(shí)候,差異更大。不信你試試。
下一次我將解釋為什么StringBuffer 的效率比String 高這么多。
swt 簡(jiǎn)單的托盤程序
java寫和操作系統(tǒng)相關(guān)的程序難度非常大。在java 6出現(xiàn)之前,如果你想實(shí)現(xiàn)一個(gè)托盤程序,最簡(jiǎn)單的就是用swt了。
通過google我找到了一段代碼。
其實(shí)很簡(jiǎn)單。主要的代碼如下:
?????????????final Tray tray = display.getSystemTray();
??????????? final TrayItem trayItem = new TrayItem(tray, SWT.NONE);
??????????? Image image = new Image (display, 16, 16);
??????????? trayItem.setImage(image);
知道了重點(diǎn),事情變的很簡(jiǎn)單了。看看所有程序
//-----------------
public class SystemTray extends Shell {
??? public static void main(String args[]) {
??????? try {
??????????? Display display = Display.getDefault();
??????????? SystemTray shell = new SystemTray(display, SWT.SHELL_TRIM);
?????????? // shell.createSystemTray(shell);
??????????? final Tray tray = display.getSystemTray();
??????????? final TrayItem trayItem = new TrayItem(tray, SWT.NONE);
??????????? Image image = new Image (display, 16, 16);
??????????? trayItem.setImage(image);
??????????? shell.open();
??????????? shell.layout();
??????????? while (!shell.isDisposed()) {
??????????????? if (!display.readAndDispatch())
??????????????????? display.sleep();
??????????? }
??????? } catch (Exception e) {
??????????? e.printStackTrace();
??????? }
??? }
??? public SystemTray(Display display, int style) {
??????? super(display, style);
??????? createContents();
??? }
??? /**
???? * Create contents of the window
???? */
??? protected void createContents() {
??????? setText("SWT Application");
??????? setSize(500, 375);
??? }
??? //swt 默認(rèn)情況下不允許shell被繼承
??? //所以我重載了父類的方法
??? protected void checkSubclass() {
???????? }
}
//--------------------
如果你想成功運(yùn)行以上代碼,你最好在eclipse下新建一個(gè)swt的類。具體操作你搜索一下吧。
但是上面的代碼只是加入了托盤,這可能是最簡(jiǎn)單的實(shí)現(xiàn)托盤的程序了。我們加入事件處理,讓程序能夠最大和最小化。然后把托盤用圖片來表示。
詳細(xì)的代碼不參考
下載
到eclipse里運(yùn)行
從8.1號(hào)開始,連續(xù)加班,再過1小時(shí)結(jié)束。
排序的算法是我們最常用的算法,初學(xué)程序,每個(gè)人都嘗試過排序。但只是局限于簡(jiǎn)單的排序。
如將下列數(shù)字進(jìn)行排序
1,3,5,8,3,6
于是我們得出結(jié)果
1,3,3,5,6,8
將下列字母(字符)進(jìn)行排序
a,i,e,f,w,s
于是我們得出結(jié)果
a,e,f,i,s,w
但是我們遇到的情況就不是如此簡(jiǎn)單了。如給公司里的商品進(jìn)行排序,我們很輕易的想到按照商品的名稱排序不就完了,而且簡(jiǎn)單明了。但現(xiàn)實(shí)并如我們相信般簡(jiǎn)單。同一商品名稱可以有不同的批次,進(jìn)貨時(shí)間,可能還會(huì)有單價(jià)的不同。顯然只根據(jù)商品名稱排序是不合理的。
再舉個(gè)簡(jiǎn)單例子然后用程序?qū)崿F(xiàn)。如公司要將員工進(jìn)行排序(不要說領(lǐng)導(dǎo)排在前面),假設(shè)我們的需求比較復(fù)雜。先進(jìn)行姓排序,誰的姓拼音靠前,誰就排前面。然后對(duì)名字進(jìn)行排序。恩.如果同名,女性排前頭。如果名字和性別都相同,年齡小的排前頭。ok,一個(gè)也不算復(fù)雜的需求。
如果對(duì)java比較熟悉的會(huì)知道java.util.Comparator 接口。要實(shí)現(xiàn)里面的函數(shù)
?int compare(Object o1, Object o2) 返回一個(gè)基本類型的整型,返回負(fù)數(shù)表示o1 小于o2,返回0 表示o1和o2相等,返回正數(shù)表示o1大于o2。
于是我們?cè)O(shè)計(jì)的人員類要有幾個(gè)變量,firstname,lastname,sex,age分別表示姓,名,性別,年齡。
public class Person {
? String firstname,lastname;
? Boolean sex;
? Integer age;
? public Person(String firstname,String lastname,Boolean sex,Integer age) {
??? this.firstname = firstname;
??? this.lastname = lastname;
??? this.sex = sex;
??? this.age = age;
? }
? public String getFirstName() {
???? return firstname;
?? }
?? public String getLastName() {
???? return lastname;
?? }
?? public Boolean getSex() {
????? return sex;
??? }
??? public Integer getAge() {
????? return age;
??? }
//為了輸入方便,重寫了toString()
public String toString()
??? {
????? return firstname +" "+lastname+" "+(sex.booleanValue()?"男":"女")+" "+age;
??? }
}
//end person
下面是要實(shí)現(xiàn)比較器
public class Comparators {
? public static java.util.Comparator getComparator() {
??? return new java.util.Comparator() {
????? public int compare(Object o1, Object o2) {
??????? if (o1 instanceof String) {
????????? return compare( (String) o1, (String) o2);
??????? }
?????? else if (o1 instanceof Integer) {
????????? return compare( (Integer) o1, (Integer) o2);
??????? }
?????? else if (o1 instanceof Person) {
????? return compare( (Person) o1, (Person) o2);
??? }
??????? else {
????????? System.err.println("未找到合適的比較器");
????????? return 1;
??????? }
????? }
????? public int compare(String o1, String o2) {
??????? String s1 = (String) o1;
??????? String s2 = (String) o2;
??????? int len1 = s1.length();
??????? int len2 = s2.length();
??????? int n = Math.min(len1, len2);
??????? char v1[] = s1.toCharArray();
??????? char v2[] = s2.toCharArray();
??????? int pos = 0;
??????? while (n-- != 0) {
????????? char c1 = v1[pos];
????????? char c2 = v2[pos];
????????? if (c1 != c2) {
??????????? return c1 - c2;
????????? }
????????? pos++;
??????? }
??????? return len1 - len2;
????? }
????? public int compare(Integer o1, Integer o2) {
??????? int val1 = o1.intValue();
??????? int val2 = o2.intValue();
??????? return (val1 < val2 ? -1 : (val1 == val2 ? 0 : 1));
????? }
????? public int compare(Boolean o1, Boolean o2) {
???????? return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1));
?????? }
????? public int compare(Person o1, Person o2) {
??????? String firstname1 = o1.getFirstName();
??????? String firstname2 = o2.getFirstName();
??????? String lastname1 = o1.getLastName();
??????? String lastname2 = o2.getLastName();
??????? Boolean sex1 = o1.getSex();
??????? Boolean sex2 = o2.getSex();
??????? Integer age1 = o1.getAge();
??????? Integer age2 = o2.getAge();
??????? return (compare(firstname1, firstname2) == 0 ?
??????????????? (compare(lastname1, lastname2) == 0 ? (compare(sex1, sex2) == 0 ? (compare(age1, age2) == 0 ? 0 :
???????????????? compare(age1, age2)) :
???????????????? compare(sex1, sex2)) :
???????????????? compare(lastname1, lastname2)) :
??????????????? compare(firstname1, firstname2));
????? }
??? };
? }
}
以上代碼有可能因?yàn)闉g覽器的布局自動(dòng)換行。
compare(Person o1, Person o2)的返回值看起來比較別扭。最簡(jiǎn)單的是
??? public int compare(Boolean o1, Boolean o2) {
???????? return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1));
?????? }
o1和o2相等返回0,否則o1如果是true 就表示o1大于o2。
再嘗試輸出結(jié)果看看
public class Main {
? public Main() {
? }
? public static void main(String[] args) {
??? Person[] person = new Person[] {
???????? new Person("ouyang", "feng", Boolean.TRUE, new Integer(27)),
???????? new Person("zhuang", "gw", Boolean.TRUE, new Integer(27)),
???????? new Person("zhuang", "gw", Boolean.FALSE, new Integer(27)),
???????? new text.Person("zhuang", "gw", Boolean.FALSE, new Integer(2)),
???? };
???? for (int i = 0; i < person.length; i++) {
?????? System.out.println("before sort=" + person[i]);
???? }
???? java.util.Arrays.sort(person, Comparators.getComparator());
? for (int i = 0; i < person.length; i++) {
??? System.out.println("after sort=" + person[i]);
? }
? }
}
輸出結(jié)果:
before sort=ouyang feng 男 27
before sort=zhuang gw 男 27
before sort=zhuang gw 女 27
before sort=zhuang gw 女 2
after sort=ouyang feng 男 27
after sort=zhuang gw 女 2
after sort=zhuang gw 女 27
after sort=zhuang gw 男 27
仔細(xì)理解java的Comparator會(huì)給你寫排序帶來很大幫助
?
?
軟件項(xiàng)目,特別是給企業(yè)用戶的項(xiàng)目,實(shí)施過程大多辛苦,而且一部分問題不在于軟件本身。
總結(jié)一下項(xiàng)目最后驗(yàn)收階段案例之一。
案例:項(xiàng)目已經(jīng)按照客戶確認(rèn)的調(diào)研文檔完成實(shí)施工作。客戶的一把手提出新需求。
此一把手H,H精通業(yè)務(wù),對(duì)電腦一竅不通。H對(duì)手下電腦部負(fù)責(zé)人Z提出“要對(duì)業(yè)務(wù)進(jìn)行風(fēng)險(xiǎn)管理,把風(fēng)險(xiǎn)大的業(yè)務(wù)提出來。”,一句話令Z頭大。Z苦惱H沒有定義什么是風(fēng)險(xiǎn)大,即使H說明風(fēng)險(xiǎn)大的條件,現(xiàn)有的軟件架構(gòu),數(shù)據(jù)模型能否實(shí)現(xiàn)還是未知數(shù)。實(shí)現(xiàn)此功能成為不可完成的任務(wù)。持續(xù)下去Z和項(xiàng)目經(jīng)理W(軟件公司負(fù)責(zé)人)都面臨困境。
Z會(huì)被認(rèn)為沒有完成領(lǐng)導(dǎo)安排的工作(實(shí)際上他忙的焦頭爛額)。
W進(jìn)入兩難,一方面客戶要求的完成不了,另一方面面臨公司的的項(xiàng)目要拖延。
解決辦法:1.按章辦事,調(diào)研文檔已經(jīng)寫清楚無此需求。直接拒絕。此為下策,沒辦法才用,但是關(guān)鍵時(shí)刻很有用。
2.引導(dǎo)+忽悠。對(duì)付H這種老總要從其公司內(nèi)部出發(fā)。分析滿足他需求所需要的條件。一般要犧牲部分工作人員的工作時(shí)間。然后把影響放大,嚇唬他。如果可以的話可以找他們的相關(guān)人員幫忙,讓他聽到不同的聲音,讓他放棄此念頭。因?yàn)檐浖峭庑校務(wù)撥浖r(shí)心里沒底氣,有自己人反對(duì),心虛。
比如從財(cái)務(wù)著手比較有效。要滿足H的需求改變了財(cái)務(wù)的核算體系,原有的數(shù)據(jù)都要加上某寫核算項(xiàng),不能保證數(shù)據(jù)準(zhǔn)確性,而且大大增加了財(cái)務(wù)工作量,而且不符合會(huì)計(jì)制度(忽悠)。上策!
轉(zhuǎn)載請(qǐng)注明出處:http://www.tkk7.com/nake/
???自從
java
發(fā)布的第一個(gè)版本開始就已經(jīng)包含
JDBC
了。目前已經(jīng)有
10
個(gè)年頭了。
JDBC4.0
將要被打包到
java6.0
里(
java SE
是
J2SE
新的名字)。它展現(xiàn)設(shè)計(jì)的重大提升和提供更加豐富的
API
,更加重視簡(jiǎn)易開發(fā)和提高生產(chǎn)力
。
??????
本文將討論一些
JDBC
在改善設(shè)計(jì)和提高性能上的重要的變化。但是不能列舉每一個(gè)變化。
注解和泛型
我想你已經(jīng)了解了包含在
JAVA 5.0
的注解(
annotations
)
和泛型(
generic
也有翻譯范型)。
JDBC4.0
也引進(jìn)了注解和泛型
DataSet
,這使得執(zhí)行
sql
語句和
SQL? DML
(
data manipulation? language
)
定義變的簡(jiǎn)單。
??????
在新的
API
里定義了一套
Query
和
DataSet
接口。
Query
接口定義了一套方法,這些方法描述了
SQL
的
select
和
update
語句。而且詳細(xì)介紹了結(jié)果集如何綁定為一個(gè)
DataSet
的。因?yàn)榉盒退?/span>
DataSet
是可以帶參數(shù)的。因此可以說
DataSet
接口是類型安全的(
type-saft
)
.
所有
Query
接口都要從
BaseQuery
接口繼承。可以通過
Connection.createQueryObject()
或者
DataSource.createQueryObject()
得到Query對(duì)象。
一個(gè)DataSet接口都繼承java.util.List。
? DataSet
是有列概念的數(shù)據(jù)集,能從
Query
接口得到,并且可以帶有參數(shù)。
DataSet
可以在連接和斷開連接的情況下使用。從而
DataSet
實(shí)現(xiàn)了
ResultSet
(連接)
或者
?
CachedRowSet
(可以斷開連接)。因?yàn)?span lang="EN-US">DataSet是java.util.List的子接口,所以可以通過java.util.Iterator來訪問每一行。
DataSet
接口可以帶系統(tǒng)或者用戶自己定義的類作為參數(shù)。通過兩種方法你可以實(shí)現(xiàn):構(gòu)造函數(shù)或者
JavaBeans
對(duì)象,任何一個(gè)辦法都能達(dá)到將用戶自定義的類綁定到結(jié)果集的列里。但是在其它支持
JavaBeans
的框架里,用
JavaBeans
對(duì)象的實(shí)現(xiàn)就顯更加容易使用。
下面簡(jiǎn)單舉例說明如何通過新的
API
創(chuàng)建和運(yùn)行
SQL
查詢。用用戶自定義的類來定義結(jié)果集。(拷貝時(shí)候小心有制表符)
pubic class Employee {
?? private int employeeId;
?? private String firstName;
?? private String lastName;
?? public int getEmployeeId() {
??????return employeeId;
?? }
??
?? public setEmployeeId(int employeeId) {
??????this.employeeId = employeeId;
?? }
?? public String getFirstName() {
??????return firstName;
?? }
?? public setFirstName(String firstName) {
??????this.firstName = firstName;
?? }
?? pubic String lastName() {
??????return lastName;
?? }
?? public setLastName(String lastName) {
??????this.lastName = lastName;
?? }
}
interface EmployeeQueries extends BaseQuery {
?? @Select (sql="SELECT employeeId, firstName, lastName FROM employee")
?? DataSet<Employee> getAllEmployees ();
?? @Update (sql="delete from employee")
?? int deleteAllEmployees ();
}
Connection con = ...
EmployeeQueries empQueries = con.createQueryObject (EmployeeQueries.class);
DataSet<Employee> empData = empQueries.getAllEmployees ();
?
異常處理的增強(qiáng):
1.??????
為
SQLException
分為兩類
transient
和
non-transient
。
2.??????
支持連鎖的異常。
3.??????
繼承了
Iterable
接口。
因?yàn)槔^承了Iterable 所以你可以這樣寫:
catch(SQLException ex) {
?? for(Throwable t : ex) {
??????System.out.println("exception:" + t);
?? }
}
參考
http://www.javaworld.com/javaworld/jw-05-2006/jw-0501-jdbc.html
JSR 221: JDBC 4.0 Specification:
http://www.jcp.org/en/jsr/detail?id=221
未完
?????????陳水扁一邊嗆美,另一邊卻熱情對(duì)待布什夫人;他前天(2006-5-9)在哥斯達(dá)黎加總統(tǒng)就職大典上兩度“突襲”美國(guó)總統(tǒng)夫人勞拉的畫面,昨天一整天在臺(tái)灣島內(nèi)電視熱播。
當(dāng)時(shí)正舉行哥國(guó)總統(tǒng)就職大典,陳水扁坐在第一排,勞拉則坐在第二排。阿扁不時(shí)轉(zhuǎn)頭瞄向左后方的勞拉,等到表演節(jié)目開始時(shí),扁跨步越過身邊所有人走到勞拉身旁寒暄。據(jù)說,扁邀請(qǐng)勞拉到臺(tái)灣訪問,勞拉則禮貌性回答“謝謝”。
?????????至典禮結(jié)束時(shí),全場(chǎng)嘉賓起身鼓掌,扁忽然再一個(gè)箭步?jīng)_向勞拉。勞拉表情有些錯(cuò)愕,但雙手繼續(xù)鼓掌。扁此時(shí)伸出右手,懸空一陣后主動(dòng)去輕抓勞拉正在鼓掌的手,迫使勞拉不得不與他相握。手一握到,扁立刻雙手緊抓不放,左手還不斷拍打,勞拉的另一只手此時(shí)卻不期然地移到自己胸前捂住,還下意識(shí)地抓緊了衣領(lǐng)。同時(shí),扁的傳譯員卻已擺好了相機(jī),扁示意勞拉對(duì)著鏡頭微笑,終于完成了這張與總統(tǒng)夫人微笑握手的歷史合照。
原文出自
http://www.zaobao.com/gj/zg060511_501.html
? 整整一天的時(shí)間都在查bug,對(duì)數(shù),然后找到錯(cuò)誤的原因。需要我認(rèn)真,仔細(xì),不要放棄,不要繞過困難。找bug需要方法和耐心,要記錄下多種數(shù)據(jù)和過程,不要做無頭蒼蠅,如果數(shù)據(jù)像今天一樣多要先給數(shù)據(jù)分類分段排除。
???最近看2本書,一本關(guān)于ajax的,一本是《Agile Software Develpment》。先看ajax,我實(shí)在不想公布它的書名,感覺被騙了,廣告做得好,翻譯和內(nèi)容都很差。《Agile Software Develpment》還行,同時(shí)也學(xué)習(xí)了英文,是本值得細(xì)讀得書。
???周六周日抽空完成了Table類的排序和搜索功能。搜索速度還能接受,搜索2萬條記錄沒感覺到停頓,更多的記錄我還沒測(cè)試,排序就夠嗆,起初花了30分鐘還沒完成,郁悶!comparator要進(jìn)行優(yōu)化。
? public int compare(Number o1, Number o2) {
??? double n1 = o1.doubleValue();
??? double n2 = o2.doubleValue();
??? if (n1 < n2) {
????? return -1;
??? } else if (n1 > n2) {
????? return 1;
??? } else {
????? return 0;
??? }
? }
感覺應(yīng)該還好,應(yīng)該是其它地方?jīng)]處理好。
接下來我要處理
1.改變JTable原來的UI 在table底下加入可以匯總的表格
2.JTable類在瀏覽器上的表現(xiàn)
3.dataset直接的關(guān)聯(lián)在table中實(shí)現(xiàn)
? ? 好像是兩年前第一次接觸eclipse,不記得版本號(hào)了。那時(shí)候eclipse小有名氣,可能是本身喊的出名字的工具就只有jb。公司買的是jb6,但是我們都貪新,用剛出的jb9。結(jié)果因?yàn)橛帽I版被borland協(xié)同工商罰了好多錢(你不信就開防火墻,用jb調(diào)試程序,看看防火墻情況)。從此公司開始使用eclipse。
?? ?正是eclipse由IBM等出資和開源的緣故有人說eclipse是六大門派里的少林,聽起來有點(diǎn)道理。武當(dāng)派(jboss)已經(jīng)歸于redhat名下(我不喜歡jboss因?yàn)樗拿掷镉袀€(gè)Boss)。可能我很喜歡eclipse了,生怕有一天開始收費(fèi),或者被收購(gòu),畢竟不是原滋原味。
??? eclipse發(fā)展太快,幾乎一個(gè)月一個(gè)Milestone,現(xiàn)在是3.2M6了,最后一個(gè)M。如果按照此速度4月要出3.2的stable build版本的RC1了。其中一項(xiàng)新特性是速度有所提升。看看我為了玩java我機(jī)器的配置吧。
今晚無聊 用google google 了google 有2,580,000,000項(xiàng)符合查詢結(jié)果。無意中有看到新成員froogle 。google家族成員越來越多,可是中文版出得就相對(duì)慢,而且不一定能順利在中國(guó)推廣,或者以后google沒個(gè)家族成員都有類似提示據(jù)當(dāng)?shù)胤煞ㄒ?guī)和政策,部分搜索結(jié)果未予顯示。
喜歡google,喜歡他簡(jiǎn)潔、快速。
Table類的mind圖.
計(jì).jpeg)
當(dāng)然還有TableModel 沒有畫進(jìn)來,因?yàn)樗鼘?huì)是變化多端的.code_name_map也沒有畫.還有輔助錄入以前寫過就不說了.
事件的處理以后再花時(shí)間寫清楚了.
今晚一邊考慮了DataRow,Cell,DataSet,DataTable,Connect,DataProvider的構(gòu)架一邊看 《一球成名》,覺得很愜意.
我的工作就是和數(shù)據(jù)庫打交道,數(shù)據(jù)庫當(dāng)然離不開dataset,用了幾年borland的dx.jar. borland這次看來真的玩完了.回想borland的歷史,每次危機(jī)時(shí)刻都有英雄出現(xiàn),扭轉(zhuǎn)局面.但愿這次也如此.
我近段時(shí)間要完成的工作:
1.完善我的dataset.
2.實(shí)現(xiàn)table里的過慮,快速查找等功能
接下來我才考慮用以上模塊實(shí)現(xiàn)項(xiàng)目管理軟件.
Subversion 已經(jīng)代替了CVS,至少在
SourceForge上是如此.我花了一個(gè)晚上時(shí)間玩玩.原來在公司用vss,感覺能用就將就了.畢竟用哪個(gè)版本控制器不重要.
java 的Table類采用了MVC模式,所以設(shè)計(jì)出多種視圖相對(duì)容易.
但是在工作中為了如果Table里的數(shù)據(jù)能用Tree的方式組織起來,數(shù)據(jù)會(huì)更加緊湊,結(jié)構(gòu)清晰.
效果如圖:但是往往工作中數(shù)據(jù)沒那么少,那么簡(jiǎn)單

下圖是樹型圖的思維圖

基本上程序上要寫的地方有:
1.實(shí)現(xiàn)TreeModel接口,
同時(shí)實(shí)現(xiàn)TableModel中幾個(gè)必要函數(shù)
public Class getColumnClass(int column);
public int getColumnCount();
public String getColumnName(int column);
public Object getValueAt(Object node, int column);
public boolean isCellEditable(Object node, int column);
public void setValueAt(Object value, Object node, int column);
使tree和table能相互結(jié)合使用
2.繼承AbstractTableModel
將1中繼承TreeModel和此結(jié)合
3.繼承TableCellRenderer
要覆蓋paint,updateUI 要實(shí)現(xiàn)getTableCellRendererComponent
4.TreeModelListener的實(shí)現(xiàn)了
整體的代碼不長(zhǎng) 但花了我不少時(shí)間.需要的話留下mail吧.
此代碼還有不完善的地方.如和sql結(jié)合.
春節(jié)是中國(guó)人傳統(tǒng)節(jié)日一年的開始。
一年的開始......
埃及海難,人們大罵船長(zhǎng)不該跑該死,埃及人都學(xué)會(huì)了“都坐下不要?jiǎng)樱岊I(lǐng)導(dǎo)先走”。
美國(guó)防部將中國(guó)列為“最具軍事威脅國(guó)家”,米國(guó)人本應(yīng)該出中文版《四年防務(wù)評(píng)估報(bào)告》,competition 對(duì)抗;競(jìng)爭(zhēng)行為,如為了利益或獎(jiǎng)品;敵對(duì) 。 menace 威脅;可能發(fā)生之危險(xiǎn);威脅。我英文不好就只能借助英語字典了。
菲律賓體育場(chǎng)發(fā)生踩踏事件,他死因?yàn)樗F。
IAEA理事會(huì)決定把伊朗核問題報(bào)告安理會(huì)。絕不讓流氓國(guó)家menace 我們泱泱大國(guó)。
我,我把我的程序整理了一遍,加了注釋,打成工具包。
我,制定了一份偉大的、可持續(xù)使用的、為別人打工的工作計(jì)劃(三的計(jì)劃)。
在http://www.mysql.com/ 下載Query Browser
運(yùn)行時(shí)需要libstdc++.so.5
原來它藏在compat-libstdc++-8-3.3.4.ix86_64.rpm
找了我超過4個(gè)小時(shí)。在http://download.fedora.redhat.com/pub/fedora/linux/core/4/x86_64/os/Fedora/RPMS/找到,需要下載下來然后
rpm -ivh compat-libstdc++-8-3.3.4.ix86_64.rpm
當(dāng)然在這之前可能要chmod -R 755 compat-libstdc++-8-3.3.4.ix86_64.rpm