我在做一个从习题数据库中查询题目的小程序,要求它在用户运行后出现主面板(Frame1类的实例),然后用户点击“查询”按钮后创建查询窗口(Frame2类的实例),用户输入查询条件后按“确定”按钮就可以在原面板上显示查询结果。就是这最后一步怎样也完不成,在下初学java,希望大侠指教。
  具体代码简写如下:
 public class Frame1 extends JFrame implements ActionListener{
                       ......
             subMenu4 = new JMenuItem("习题检索");
             subMenu4.addActionListener(this);
                       ......
             public void actionPerformed(ActionEvent e){
                 if(e.getSource()==subMenu4){
                             new Frame2();
                 }
             }
 }
 public class Frame1 extends JFrame implements ActionListener{
                       ......
             jButton1.setText("确定");
             jButton1.addActionListener(this)
                       ......
             public void actionPerformed(ActionEvent e){
                 if(e.getSource()==jButton1){
                             //这里应该怎样做才能在原窗口中显示结果,
                             //而不是新建Frame1实例?       
                 }
             }
 }
 ps:个人感觉没有指针用真是很痛苦(貌似可以传递对象的引用)......
             

解决方案 »

  1.   

    抱歉写错了,下面的类应该是Frame2。
      

  2.   

    可以把Frame1类的this传递给
    在Frame2类中加一个JFrame成员 JFrame previous;
    再加一构造函数
    void Frame2(JFrame jf){
        this.previous = jf;
    }Frame1的函数改为
                 public void actionPerformed(ActionEvent e){
                     if(e.getSource()==subMenu4){
                                 new Frame2(this);/////////////////////////////
                     }
                 }要显示再调用一下previous
    应该可以吧
      

  3.   

    用JDIALOG试试,或者用BEAN的SET或GET方法
      

  4.   

    问题还没有解决 to zhanghao85() ( ) 
    现在已经可以通过使用this.previous.(加方法)来对Frame1的实例进行操作,但似乎还不能操作自己定义的任何成员变量,方法,以及类变量,方法。比如原来Frame1的实例有一个jTextArea组件,现在应怎样把查询结果直接输出到jTextArea上呢?
      to lixiaoxue85(蛮野蛮)
    如果是jdialog的话具体怎样用呢?我也想过可惜没有办法。javabean我们还没学过。
      

  5.   

    其实你根据自己想要操作的对象的数量传,比如就一个textarea你就可以直接把他传过去 ,然后setText就可以了~   如果多的话  你把this整个传过去,然后一个一个的取属性 或者方法用
      

  6.   

    Frame1的实例有一个jTextArea 设置为static 
    Frame2 里,直接通过 Frame1.text.setText();方法比较不安全,嘿嘿
      

  7.   

    自己写一个事件监听器,用事件传递
    public class Frame1 extends JFrame implements ActionListener,DataListener{
    public Frame1(){

    }
                           ......
                 subMenu4 = new JMenuItem("习题检索");
                 subMenu4.addActionListener(this);
                           ......
                 public void actionPerformed(ActionEvent e){
                     if(e.getSource()==subMenu4){
                      
                                 new Frame2().addDataListener(this);
                     }
                 }
                 public void receiveData(DataBean bean){
                  //将bean的数据填入相应字段
                 }
     }
     public class Frame2 extends JFrame implements ActionListener{
            DataListener listener=null;
                           ......
                 jButton1.setText("确定");
                 jButton1.addActionListener(this)
                           ......
                 public void actionPerformed(ActionEvent e){
                     if(e.getSource()==jButton1){
                                 //这里应该怎样做才能在原窗口中显示结果,
                                 //而不是新建Frame1实例?
                      //填充bean数据
                      DataBean db = DataBean();
                      //将bean数据发送给监听器
                      listener.receiveData(bean);
                     }
                 }
                 public void addDataListener(DataListener listener){
                  this.listener=listener;
                 }
     } public interface DataListener{
     public void receiveData(DataBean bean);
     }
      

  8.   

    采用模态对话框JDialog frame2 = new JDialog(frame1,"frame2",true);
    frame2 .show();//线程阻塞,当frame2点确定或退出按钮后自动关闭并执行后面的语句
    if(frame2被点确定按钮){
      frame1.gouShi = frame2.getGouShi();
    }
      

  9.   

    首先感谢各位的回答,我们昨天已经解决了这个问题,大体上用的zhanghao85()的方法,只不过略做修改,使得this.previous可以控制Frame1里的任何方法和变量了,只不过我们的方法不是很安全,感觉上shengli_liao(我是谁?) 的方法更好一些,大概学了javabean会有更合适的方法吧,分数立即兑现。