我用主窗口调用了一个新的子窗口并输入了要查找的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);
}}

解决方案 »

  1.   

    贴代码时用 代码格式,上面有个 #号,点下插入代码. 别人看的会清楚点,增加问题的成功解决率。  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);
    }}
      

  2.   

    说明一下,楼主自己的猜测是正确的。一般而言,不要再界面操作中做耗时的操作,比如连接网络,查数据库,读写大文件。 否则界面会锁住,情况如楼主看到的一样。
    那应该怎么处理呢? 开一个新线程,专门去做耗时操作,这样界面就一直是活动状态。 等操作作完了,如数据查回来了,在放到界面显示。不过要提醒一点: Swing不是线程安全的,一般不允许非swing线程直接操作界面. 这时候要用SwingUtilities.invokeLater(event);方法