如何使用反射从视图和控制器向多个JButton添加监听器?

时间:2013-11-24 00:39:05

标签: java model-view-controller reflection

使用反射实现 MVC模式时遇到一些困难。

我有模型我对这个模型一无所知。我正在用反思来推断;

我还有查看;该视图将实例化一个对象列表(JButton,JTextField等等),并且还有一个向按钮添加侦听器的方法,而这些方法又将调用我的控制器上的方法。 / p>

然后我有控制器,它实现了一个ActionListener。

到目前为止一切都很好,它有效...我可以通过编程方式设置按钮,添加监听器,在控制器上执行方法并要求控制器更新模型,我相信我已经在MVC的正确轨道上了。但是,我正试着用反射来做这件事。

例如:我从控制器转到模型。我选择了一个给定的类(同样,我对这个类一无所知)并获得该类的所有setter。

然后我要求 View 为所有我的setter创建一系列JTextFields(如果是这种情况),使用Save按钮稍后从动作侦听器执行setter

如果我获得2个setter,视图将创建2个JTextFields和2个保存按钮。但我怎么知道,按下了什么按钮?换句话说,我怎么知道那个按钮属于哪个setter?通常,这不会有问题,但就像我说的,我对模型一无所知,所以查看可能会创建1,2,3或者a使用JTextFields,JButton等按钮的大量按钮......

我正在为一个类项目开发一个Naked Objects框架。因此,当我说我对模型一无所知时,是因为我正在创建一个基于可能存在的任何模型的GUI。因此创建了一些与我的按钮,文本字段,视图中的列表以及需要执行的方法相关的问题。

非常感谢所有帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

区分两个按钮的唯一方法是添加您知道在您注册的侦听器触发时将存在的状态。之前,在我的评论中,我建议您可以从控件继承并在那里添加您的状态。

public class MyButton extends JButton{
    private Runnable onActionPerfomed;

    public Runnable getMyAction(){
        return onActionPerfomed;
    }

    public void setMyAction(Runnable r){
        onActionPerfomed = r;
    }
}

final MyButton button = new MyButton();
button.setName("button xpto");
button.setMyAction(new Runnable() {

    @Override
    public void run() {
        System.out.println("Hey I'm running this on button " + button.getName());
    }
});

button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() instanceof MyButton){
            MyButton btn = (MyButton)e.getSource();
            btn.getMyAction().run();
        }
    }
});

你可以通过使控件实现一个更合适的接口来实现这样的效果。 最后为什么要为所有控件注册相同的侦听器?我认为你真的应该注册不同的听众,因为这就是我提供的代码以不同的方式。