今天成绩都出来了,结果还是比较理想的,以后会相对轻松些。
更新日志都是半个月前的事了,当时还说以后每天都更新,真是惭愧
这几天都是忙考试,弄得心力憔悴,今天晚上终于闲下来,继续写实践的程序。
刚刚解决了前几个小时的困惑,现在对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》。