我用主窗口调用了一个新的子窗口并输入了要查找的teacher的教师号,并按确定关闭子窗口,回到主窗口去开始查找,但是在子窗口输入的教师号teacherno就是无法立刻传回去,在我用println显示的时候没有东西,可偏偏最后又显示了,好像那个子窗口的actionPerformed函数是在等我把select语句都执行完后才执行的。不知道这问题怎么解决 ,大侠们救救! if(e.getSource()==jCbyteacher){
// String teacherno;
ByteacherDlg byteacherdlg=new ByteacherDlg();//问题就在这个类里
String teacherno=ByteacherDlg.teacherNo;
System.out.println("bbbb");
System.out.println(teacherno);//这里无法显示那个值,只是个null
jtable.removeAll();
DefaultTableModel dtm=new DefaultTableModel();
try{
System.out.println("try");
JDBC_Connection.rs=JDBC_Connection.stmt.executeQuery("select course.CourseNo,course.CourseName,course.TNo,course.Weekday,course.Time,roomstate.RNo" +
" from course,roomstate where course.CourseNo=roomstate.CourseNo and course.TNo="+"'teacherno'"+";");
JDBC_Connection.rsmd=JDBC_Connection.rs.getMetaData();
int size=JDBC_Connection.rsmd.getColumnCount();
System.out.println(size);
String []columnName;
columnName=new String[size];
for(int i=1;i<=size;i++){
columnName[i-1]=JDBC_Connection.rsmd.getColumnName(i);
dtm.addColumn(columnName[i-1]);
}
while(JDBC_Connection.rs.next()){
String courseno=JDBC_Connection.rs.getString(1);
String coursename=JDBC_Connection.rs.getString(2);
teacherno=JDBC_Connection.rs.getString(3);
String weekday=JDBC_Connection.rs.getString(4);
String time=JDBC_Connection.rs.getString(5);
String roomno=JDBC_Connection.rs.getString(6);
Vector row=new Vector();
row.add(courseno);
row.add(coursename);
row.add(teacherno);
row.add(weekday);
row.add(time);
row.add(roomno);
dtm.addRow(row);
jtable.setModel(dtm);
jtable.updateUI();
}
// System.out.println("事件响应");
}catch(Exception ex){ex.printStackTrace();};
}
}
ByteacherDlg类的代码:
package classroomsystem;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;public class ByteacherDlg extends JFrame implements ActionListener{
JTextField jtf;
JLabel jlabel;
JButton jb;
static public String teacherNo=new String();
ByteacherDlg(){
jtf=new JTextField();
jlabel=new JLabel("教师号");
jb=new JButton("确定");
jb.addActionListener(this);
this.add(jtf,BorderLayout.CENTER);
this.add(jlabel,BorderLayout.NORTH);
add(jb,BorderLayout.SOUTH);
this.setBounds(30,40, 250, 140);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e){
// String teacherNo;
ByteacherDlg.teacherNo=jtf.getText();
System.out.println(ByteacherDlg.teacherNo);
// System.out.println(teacherNo);
// this.dispose();
this.setVisible(false);
}}
// String teacherno;
ByteacherDlg byteacherdlg=new ByteacherDlg();//问题就在这个类里
String teacherno=ByteacherDlg.teacherNo;
System.out.println("bbbb");
System.out.println(teacherno);//这里无法显示那个值,只是个null
jtable.removeAll();
DefaultTableModel dtm=new DefaultTableModel();
try{
System.out.println("try");
JDBC_Connection.rs=JDBC_Connection.stmt.executeQuery("select course.CourseNo,course.CourseName,course.TNo,course.Weekday,course.Time,roomstate.RNo" +
" from course,roomstate where course.CourseNo=roomstate.CourseNo and course.TNo="+"'teacherno'"+";");
JDBC_Connection.rsmd=JDBC_Connection.rs.getMetaData();
int size=JDBC_Connection.rsmd.getColumnCount();
System.out.println(size);
String []columnName;
columnName=new String[size];
for(int i=1;i<=size;i++){
columnName[i-1]=JDBC_Connection.rsmd.getColumnName(i);
dtm.addColumn(columnName[i-1]);
}
while(JDBC_Connection.rs.next()){
String courseno=JDBC_Connection.rs.getString(1);
String coursename=JDBC_Connection.rs.getString(2);
teacherno=JDBC_Connection.rs.getString(3);
String weekday=JDBC_Connection.rs.getString(4);
String time=JDBC_Connection.rs.getString(5);
String roomno=JDBC_Connection.rs.getString(6);
Vector row=new Vector();
row.add(courseno);
row.add(coursename);
row.add(teacherno);
row.add(weekday);
row.add(time);
row.add(roomno);
dtm.addRow(row);
jtable.setModel(dtm);
jtable.updateUI();
}
// System.out.println("事件响应");
}catch(Exception ex){ex.printStackTrace();};
}
}
ByteacherDlg类的代码:
package classroomsystem;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;public class ByteacherDlg extends JFrame implements ActionListener{
JTextField jtf;
JLabel jlabel;
JButton jb;
static public String teacherNo=new String();
ByteacherDlg(){
jtf=new JTextField();
jlabel=new JLabel("教师号");
jb=new JButton("确定");
jb.addActionListener(this);
this.add(jtf,BorderLayout.CENTER);
this.add(jlabel,BorderLayout.NORTH);
add(jb,BorderLayout.SOUTH);
this.setBounds(30,40, 250, 140);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e){
// String teacherNo;
ByteacherDlg.teacherNo=jtf.getText();
System.out.println(ByteacherDlg.teacherNo);
// System.out.println(teacherNo);
// this.dispose();
this.setVisible(false);
}}
// String teacherno;
ByteacherDlg byteacherdlg=new ByteacherDlg();//问题就在这个类里
String teacherno=ByteacherDlg.teacherNo;
System.out.println("bbbb");
System.out.println(teacherno);//这里无法显示那个值,只是个null
jtable.removeAll();
DefaultTableModel dtm=new DefaultTableModel();
try{
System.out.println("try");
JDBC_Connection.rs=JDBC_Connection.stmt.executeQuery("select course.CourseNo,course.CourseName,course.TNo,course.Weekday,course.Time,roomstate.RNo" +
" from course,roomstate where course.CourseNo=roomstate.CourseNo and course.TNo="+"'teacherno'"+";");
JDBC_Connection.rsmd=JDBC_Connection.rs.getMetaData();
int size=JDBC_Connection.rsmd.getColumnCount();
System.out.println(size);
String []columnName;
columnName=new String[size];
for(int i=1;i<=size;i++){
columnName[i-1]=JDBC_Connection.rsmd.getColumnName(i);
dtm.addColumn(columnName[i-1]);
}
while(JDBC_Connection.rs.next()){
String courseno=JDBC_Connection.rs.getString(1);
String coursename=JDBC_Connection.rs.getString(2);
teacherno=JDBC_Connection.rs.getString(3);
String weekday=JDBC_Connection.rs.getString(4);
String time=JDBC_Connection.rs.getString(5);
String roomno=JDBC_Connection.rs.getString(6);
Vector row=new Vector();
row.add(courseno);
row.add(coursename);
row.add(teacherno);
row.add(weekday);
row.add(time);
row.add(roomno);
dtm.addRow(row);
jtable.setModel(dtm);
jtable.updateUI();
}
// System.out.println("事件响应");
}catch(Exception ex){ex.printStackTrace();};
}
}
ByteacherDlg类的代码:
package classroomsystem;import javax.swing.*;
import java.awt.*;
import java.awt.event.*;public class ByteacherDlg extends JFrame implements ActionListener{
JTextField jtf;
JLabel jlabel;
JButton jb;
static public String teacherNo=new String();
ByteacherDlg(){
jtf=new JTextField();
jlabel=new JLabel("教师号");
jb=new JButton("确定");
jb.addActionListener(this);
this.add(jtf,BorderLayout.CENTER);
this.add(jlabel,BorderLayout.NORTH);
add(jb,BorderLayout.SOUTH);
this.setBounds(30,40, 250, 140);
this.setVisible(true);
}
public void actionPerformed(ActionEvent e){
// String teacherNo;
ByteacherDlg.teacherNo=jtf.getText();
System.out.println(ByteacherDlg.teacherNo);
// System.out.println(teacherNo);
// this.dispose();
this.setVisible(false);
}}
那应该怎么处理呢? 开一个新线程,专门去做耗时操作,这样界面就一直是活动状态。 等操作作完了,如数据查回来了,在放到界面显示。不过要提醒一点: Swing不是线程安全的,一般不允许非swing线程直接操作界面. 这时候要用SwingUtilities.invokeLater(event);方法