春天里,百花香...
#
書分專業書與閑書.專業書是安身立命之本,建功立業之基,只要對自己有益的,在經濟能力能承受的基礎上應該多買多看.閑書基本只起業余調劑作用,可看可不看,切勿拿小菜當正餐,過分閱讀只有迷惑心智,分散精力的后果.切不可沉迷于其中,所謂玩物喪志是也.
無論錢多寡,買書都應該精挑細選,確實是好書才買,買了壞書或一般書除了浪費錢財,耽誤時間,還喪失了讀好書的時間和機會,要知道在現在煩雜的社會生活中偷得浮生半日閑也是不容易的,何況以后看見還添堵,與其如此還不如鍛煉出鑒別良莠的眼光.
專業書分精品與平裝.精品是指那種老外寫的,大部頭的,全面詳細的書,這種書雖貴,但讀來收益很大,有微言大義,能常讀常新,不像那些國內翻譯,改寫的,只抄個皮毛,買來如同雞肋,還不如不買.
看書一定要動筆記點寫點什么,所謂"不動筆墨不讀書",道理說不上來,但確實有效,寫在筆記本或博客都行.閑書可寫讀后感,鍛煉以下文筆也不錯.當然看書能把所讀熟記于心最好,不要依賴筆記.依賴筆記會養成怠惰的習慣,真要用時一不能立即提出對策,二不一定能找到筆記在那干著急.筆記是用來總結回味的,不是隨用隨查的電子書籍.
書只能教你知識,不要期待書本或者人能指明你現在該自己干什么,他們只能大致指出一個方向,道還要靠自己去追尋.
摘要: 1.論壇和電視非常相象.
2.論壇的最大作用是開闊眼界,但開闊的程度取決于你自己.它猶如一個垃圾堆,找到件寶貝需要花費大量時間.
3.論壇的積分,精華,良好數都是虛幻的,應當視如草芥.
4.最好只在無聊時需要消遣時逛逛論壇,這樣你花的時間和逛論壇所得在價值上才對等.
5.拿你自己的時間生命投資現實比投資虛幻要來得實在.
閱讀全文
摘要: 1.急于出名賺錢的想法.
2.從眾的想法.
3.破罐子破摔的想法.
4.早有蜻蜓立上頭的想法.
閱讀全文
本人在做一個在JTable上點擊右鍵彈出菜單的程序時,遇到了這樣的問題--菜單首項需要根據點擊的表格行的"表名列"改變,這需要我們做一點小小的工作,其實就是
根據點擊的位置推算所在行,好了,廢話少說,看代碼吧.
1.表格的建立過程
String[] headers = { "No", "Table Name" };
Object[][] cellData = null;
DefaultTableModel model = new DefaultTableModel(cellData, headers) {
public boolean isCellEditable(int row, int column) {
// 第N列可以編輯
/*
* if (column == N) { return false; }
*/
// 整個表都不能編輯
return false;
}
};
table = new JTable(model);
2.菜單的建立
popupMenu=new JPopupMenu();
tableNameItem=new JMenuItem("");
selectItem=new JMenuItem("Select SQL");
insertItem=new JMenuItem("Insert SQL");
deleteItem=new JMenuItem("Delete SQL");
updateItem=new JMenuItem("Update SQL");
hbmItem=new JMenuItem("hbm xml");
hbmPojoItem=new JMenuItem("Pojo Class");
popupMenu.add(tableNameItem);
popupMenu.addSeparator();
popupMenu.add(selectItem);
popupMenu.add(insertItem);
popupMenu.add(deleteItem);
popupMenu.add(updateItem);
popupMenu.addSeparator();
popupMenu.add(hbmItem);
popupMenu.add(hbmPojoItem);
3.菜單的彈出處理
table.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt) {
if (evt.isPopupTrigger()) {
// 取得右鍵點擊所在行
int row=evt.getY()/table.getRowHeight();
/**
* 取得是表名的那一列
*/
int tableNameColumn=-1;
for(int i=0;i<table.getColumnModel().getColumnCount();i++){
TableColumn selColumn = table.getColumnModel().getColumn(i);
String columnHeader=(String)selColumn.getHeaderValue();
if(columnHeader.equals("Table Name")){
tableNameColumn=i;
break;
}
}
/**
* 取得表名并彈出菜單
*/
if(tableNameColumn!=-1){
/**
* 修改菜單首條的名稱
*/
String tableName=(String)table.getValueAt(row,tableNameColumn);
tableNameItem.setText(tableName);
// 彈出菜單
popupMenu.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
}
}
4.實現的效果如下:

1 import java.awt.event.ActionEvent;
2 import java.awt.event.ActionListener;
3 import java.text.SimpleDateFormat;
4 import java.util.Calendar;
5 import javax.swing.ButtonGroup;
6 import javax.swing.JMenu;
7 import javax.swing.JRadioButtonMenuItem;
8 import javax.swing.Timer;
9
10 public class TimeMenu extends JMenu{
11 private static final long serialVersionUID = 1L;
12 private final static int ONE_SECOND=1000;
13 private String timeStyle="";
14
15 public TimeMenu(String text){
16 super(text);
17 timeStyle="yyyy-MM-dd HH:mm:ss";
18 timer.start();
19 addSubMenuItems();
20 }
21
22 Timer timer=new Timer(ONE_SECOND,new ActionListener(){
23 public void actionPerformed(ActionEvent evt){
24 setCurrTimeToText();
25 }
26 });
27
28 private void addSubMenuItems(){
29 String[] items=new String[]{"yyyy-MM-dd HH:mm:ss","HH:mm:ss","yyyy-MM-dd"};
30
31 ButtonGroup buttongroup = new ButtonGroup();
32
33 for (int i = 0; i < items.length; i++) {
34 JRadioButtonMenuItem timeMitem = new JRadioButtonMenuItem(
35 items[i], i == 0);
36
37 final String timeStyleTmp = items[i];
38 timeMitem.addActionListener(new ActionListener() {
39 public void actionPerformed(ActionEvent e) {
40 try {
41 timeStyle=timeStyleTmp;
42 } catch (Exception ex) {
43 System.out.println("Can't Change Time Style to "
44 + timeStyleTmp);
45 }
46 }
47 });
48 buttongroup.add(timeMitem);
49 this.add(timeMitem);
50 }
51 }
52
53 private void setCurrTimeToText(){
54 this.setText(getCurrTime(timeStyle));
55 }
56
57 private String getCurrTime(String timeStyle){
58 Calendar cal= Calendar.getInstance();
59 SimpleDateFormat fromatter=new SimpleDateFormat(timeStyle);
60 String strCurrTime=fromatter.format(cal.getTime());
61
62 return strCurrTime;
63 }
64 }
用法如下:
1 JMenuBar menubar = new JMenuBar();
2 mainFrame.setJMenuBar(menubar);
3
4 

5
6 TimeMenu timeMenu = new TimeMenu("Time");
7 menubar.add(timeMenu);
8
9
看spring的ioc,感覺很點意思,于是自己寫了一個Spring之FileSystemXmlApplicationContext的模擬類,貼出來請大家斧正.
1.功能說明:關于訂單,折扣,價格
訂單是貨物的訂單,主要貨物有計算機,文具,紙張三類,還有其它一些物件.每種貨物都有不同的折扣比例,從單價中扣除折扣比例后就是進貨時的真實價格.
2.Spring之Ioc實現
這里就不贅述了,詳情請見帖子
http://www.tkk7.com/sitinspring/archive/2007/06/06/122326.html
3.模擬實現
// 折扣接口
public interface Discount{
public float getDiscount();
public void setDiscount(float discount);
}
// 計算機折扣類
public class ComputerDiscount implements Discount{
private float discount=0.0f;
public float getDiscount(){
return discount;
}
public void setDiscount(float discount){
this.discount=discount;
}
}
// 文具折扣類
public class StationaryDiscount implements Discount{
private float discount=0.0f;
public float getDiscount(){
return discount;
}
public void setDiscount(float discount){
this.discount=discount;
}
}
// 紙張折扣類
public class PaperDiscount implements Discount{
private float discount=0.0f;
public float getDiscount(){
return discount;
}
public void setDiscount(float discount){
this.discount=discount;
}
}
// 其它折扣類
public class OtherDiscount implements Discount{
private float discount=0.0f;
public float getDiscount(){
return discount;
}
public void setDiscount(float discount){
this.discount=discount;
}
}
// 訂單類
public class Order{
public static final String Type_Computer="Computer";
public static final String Type_Stationary="Stationary";
public static final String Type_Paper="Paper";
private String type;
private float price;
public Order(float price,String type){
this.price=price;
this.type=type;
}
public Order(){
this(100.0f,"Other");
}
// 調用模擬類的地方,看看調用過程和Spring很相似吧
public float getPrice() {
MockContext ctx = new MockContext("bean.xml");
Discount discount = null;
discount = (Discount) ctx.getBean(this.type);
return price * (1.0f - discount.getDiscount());
}
}
// Spring之FileSystemXmlApplicationContext的模擬類
/**
* Spring之FileSystemXmlApplicationContext的模擬類
*
* @author junglesong
*
*/
public class MockContext {
Document doc = null;// 用于解析Bean配置文件的Xml Document
Element root = null;// Bean文件的根節點
/**
* 構造函數,用于初始化doc和root
* @param beanFileName
*/
public MockContext(String beanFileName) {
SAXBuilder buider = new SAXBuilder();
try {
doc = buider.build(new File(beanFileName));
root = doc.getRootElement();
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* 根據beanId創建類并調用規定的方法
*
* @param beanId
* @return
*/
public Object getBean(String beanId) {
Object obj=null;
try {
Element beanElm =getSubElm(root,"id",beanId);
if(beanElm!=null){
String className=beanElm.getAttribute("class").getValue();
Class cls=Class.forName(className);
// 由類得到類實例
obj=cls.newInstance();
List ls=beanElm.getChildren();
for(Iterator it=ls.iterator();it.hasNext();){
Element elm=(Element)it.next();
String methodName=elm.getAttributeValue("name");
String methodValue=(String)elm.getChildText("value");
// 取得類方法
Method method = cls.getMethod(getSetterMethod(methodName), new Class[] {getClassByValue(methodValue)});
// 建立數組
Object params[]=getParamsByValue(methodValue);
// 調用類方法
method.invoke(obj,params);
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
return obj;
}
/**
* 由參數的值得到參數的類型,目前可處理浮點數和字符串兩種情況
*
* @param value
* @return
*/
private Class getClassByValue(String value){
Class cls=String.class;
try{
Float.parseFloat(value);
cls=float.class;
}
catch(Exception ex){
ex.printStackTrace();
}
return cls;
}
/**
* 由參數的值得到包含參數的數組,目前可處理浮點數和字符串兩種情況
*
* @param value
* @return
*/
private Object[] getParamsByValue(String value){
Object[] params=new Object[1];
try{
Float.parseFloat(value);
params[0]=new Float(Float.parseFloat(value));
}
catch(Exception ex){
ex.printStackTrace();
params[0]=new String(value);
}
return params;
}
/**
* 取得root下屬性為subElmAttr,值等于subElmValue的節點
*
* @param root
* @param subElmAttr
* @param subElmValue
* @return
*/
private Element getSubElm(Element root,String subElmAttr,String subElmValue){
Element rtv=null;
List ls=root.getChildren();
for(Iterator it=ls.iterator();it.hasNext();){
Element elm=(Element)it.next();
if(elm.getAttribute(subElmAttr).getValue().equals(subElmValue)){
rtv=elm;
break;
}
}
return rtv;
}
/**
* 取得setter方法
*
* @param methodName
* @return
*/
private String getSetterMethod(String methodName){
return "set"+methodName.substring(0,1).toUpperCase()+methodName.substring(1,methodName.length());
}
}
調用的代碼如下:
java 代碼
Order computerOrder=new Order(100.0f,Order.Type_Computer);
System.out.println("computerOrder's price is \t"+computerOrder.getPrice());
Order stationaryOrder=new Order(100.0f,Order.Type_Stationary);
System.out.println("stationaryOrder's price is \t"+stationaryOrder.getPrice());
Order paperOrder=new Order(100.0f,Order.Type_Paper);
System.out.println("paperOrder's price is \t\t"+paperOrder.getPrice());
Order otherOrder=new Order();
System.out.println("otherOrder's price is \t\t"+otherOrder.getPrice());
輸出效果和使用Spring是一樣的,速度慢了些,但可以優化:
java 代碼
computerOrder's price is 70.0
stationaryOrder's price is 80.0
paperOrder's price is 90.0
otherOrder's price is 95.0
感悟:自己做過一遍后,覺得很多框架并非想像中那樣神秘高深,只要肯動腦筋,愿意動手,我們有機會站在時代的風口浪尖上,: ).
sitinspring(http://www.tkk7.com)原創,轉載請注明出處.