功能描述:将 JFileChooser 选中的文件路径显示在 JTextField 中。(actionLinstener类和显示是分开的,就是说是两个类)问题描述:
两个类 MyView 用于 UI显示,  MyLinstener 用于侦听事件处理。 
在MyView类中有两个组件一个JButton 一个JTextField,linstener侦听到JButton的点击事件后,启动一个JFileChooser,让用户选中目标文件,然后将目标文件的路径显示在JTextField里,文件的路径是在linstener中拿到的,怎么将该内容送回到MyView类中的JTextField上呢?请教了,谢谢!

解决方案 »

  1.   

     网上看到的相关例子都是UI 类 实现了ActionListener接口,如果是在一个类里面的话,就好办了,直接调用JTextField的setText方法,将listener类独立出来后,难道要讲UI类在listener里放一个引用?
    或者不能将listener类独立出来?
      

  2.   

    还是不要将listener类独立出来比较好
    因为事件类代码并不多
    一般都写成内部类的如果要独立出来的话 那就要UI类在listener里放一个引用
      

  3.   

    如2楼所说,Listener放UI类中比较好操作。
    Listener类独立的话,想要在Listener对象中放UI对象的引用,其实也是比较难做到的。
    一种方式是可以在主窗口或代表Application的主类上放静态属性,方便UI设值,也方便Listener取值。
      

  4.   

    ----是不是这个意思:
    MyLinstener implements ActionListener-----------------JButton b=new JButton();b.addActionListener(new MyLinstener()); //注册事件处理器
      

  5.   

    蛋疼的想法:(这块API不熟悉)重写一下这个按钮:
    MyButton extends JButton{
    private MyView view;//你的UI
    public MyButton(MyView view,String buttonName){
    super(buttonName);
    this.view=view;
    }
    }
    ------在MyView 中创建Button-----
    MyButton b=new MyButton(this,"buttonName");
    --------MyLinstener中获取UI------
    Object b=e.getSource();
    MyButton mb=(MyButton )b;
    MyView view=mb.view;
      

  6.   

    5楼利用构建器参数注入依赖的做法也不错啊。不过要是注入Frame可能就更方便在Listener中访问Frame中的JTextField了。
      

  7.   

      到网上去找一些javaSwing程序的MVC框架的代码,UI和Listener是分开的。用swt-designer是可以实现的,VE是eclipse官网开源的java图形界面可视化开发插件。在UI里做个引用是完全可以的,不过一般是写在内部类的。其实我想说用委托,不过这是软件设计模式里的,如果构架的不好就还是不要用委托,不然越搞越乱的。
      

  8.   

    内部类是最好的解决方法,当然你可以把JTextField传递给你的监听器