今天成績都出來了,結果還是比較理想的,以后會相對輕松些。
更新日志都是半個月前的事了,當時還說以后每天都更新,真是慚愧
這幾天都是忙考試,弄得心力憔悴,今天晚上終于閑下來,繼續寫實踐的程序。
剛剛解決了前幾個小時的困惑,現在對JAVA的內部類機制又有了更新的認識(興奮中
......),廢話少說,來看代碼:
package tanzhang;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.TabFolder;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.swt.widgets.Text;
import com.swtdesigner.SWTResourceManager;
import org.eclipse.swt.widgets.TabItem;
public class tanzhang {
?/**
? * Launch the application
? * @param args
? */
?private static Table table;
?private static TableItem newItemTableItem;
?
?public static void main(String[] args) {
??final Display display = Display.getDefault();
??final Shell shell = new Shell();
??shell.setImage(SWTResourceManager.getImage(tanzhang.class, "/org/eclipse/ui/internal/forms/widgets/progress.gif"));
??shell.setSize(774, 514);
??shell.setText("宣城供電局消弧線圈臺帳");
............
............
............
??final Combo combo_1 = new Combo(composite, SWT.READ_ONLY);
??combo_1.addSelectionListener(new SelectionAdapter() {
???public void widgetSelected(SelectionEvent arg0) {
????String str=combo_1.getText();
????try{?
?????String dbUrl = "jdbc:odbc:test";
?????Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
?????Connection conn = DriverManager.getConnection(dbUrl, "", "");
?????Statement stmt=conn.createStatement();
?????String sql="SELECT * from test where 單元名稱="+str;
?????ResultSet rs=stmt.executeQuery(sql);
?????
?????if(rs.next()){
?????for(int i=0;i<=4;i++){?????????
???????newItemTableItem.setText(i,rs.getString(i+1));??
???????}
?????
?????rs.close();
?????stmt.close();
?????conn.close();
?????}
????}catch(Exception e){}
????
???}
??});
............
............
............
??table = new Table(composite_1, SWT.VIRTUAL | SWT.FULL_SELECTION | SWT.BORDER | SWT.HIDE_SELECTION);
??table.setLinesVisible(true);
??table.setHeaderVisible(true);
??table.setBounds(0, 0, 678, 80);
............
............
............
???剛開始是用final修飾table和newItemTableItem,但是“newItemTableItem.setText(i,rs.getString(i+1));”這行(代碼中蘭色那句)會報錯,編譯器提示“無法解析newItemTableItem”。我的第一反應是監聽器的位置放得不對。翻了一下書,說SWT/JFace事件代碼中要訪問類中變量有三種方法:(1)加final;(2)將變量變為類的實例變量;(3)將事件代碼寫成命名內部類,然后通過構造函數的參數來傳入。
???想了想好象只有第三種方法值得試試,但是后來想起來newItemTableItem是個對象,傳入以后卻不知道怎么轉換類型,呆了...
???最后做了個新的程序試了試,在新程序里是成功的,就是要把newItemTableItem在main函數外申明其為private static,但是在舊的程序中,編譯器是通過了,但是進行連接數據庫查詢的時候,出現“Fatal Exception...”的錯誤,當時一下就蒙掉了!!完全一樣的,怎么會不成功。
???百般無奈以后,----當然之前肯定是深思熟慮----終于腦海中閃出了傳說中的“靈感”!于是馬上把table也定義為private static......OK!???勝利總是來得那么突然,那瞬間的感覺就象90分鐘打進的金球...
???當然到現在,我還沒找到確切的原因。只能用自己的話總結一下:(1)匿名內部類中的方法是不能訪問其他方法中定義的變量的(包括實例對象),要訪問必須在類中將其定義為static類型。(2)TableItem是Table的子控件,要定義TableItem為static也要同時把Table定義為static類型。
???給自己一個任務:研究JAVA的內部類機制;研究SWT中父子控件關系的機制!
???看看《Thinking in JAVA》或許會是個不錯的選擇,當然還有《The Definitive Guide to SWT and JFace》。
?