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



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

我有型号我对这个型号一无所知。我在沉思;

我还有一个视图;该视图将实例化对象列表(JButton、JTextField和其他,…),还具有一个向按钮添加侦听器的方法,该方法反过来将调用我的控制器上的方法。

然后我有了实现ActionListener的控制器

到目前为止一切都很好,它有效。。。我可以通过编程设置按钮,添加监听器,在控制器上执行方法,并要求控制器更新模型,我相信我在MVC方面走在了正确的轨道上。然而,我正试图通过反思来做到这一点。

例如:我从控制器转到模型。我选择一个给定的类(再说一遍,我对这个类一无所知),并获得该类的所有设置者。

然后,我要求View为我的所有setter创建一系列JTextFields(如果是这样的话),并使用Save按钮稍后从操作监听器执行setter。

如果我得到2个setter,那么视图将创建2个JTextFields和2个保存按钮。但我怎么知道,按下了什么按钮?换句话说,我怎么知道那个按钮属于哪个setter?通常情况下,这不会是一个问题,但正如我所说,我对Model一无所知,所以View可能会创建1、2、3或大量带有JTextFields、JButtons等的按钮。。。

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

我们非常感谢所有的帮助。非常感谢。

区分两个按钮的唯一方法是添加您知道在您注册的侦听器启动时会出现的状态。早些时候,在我的评论中,我建议您可以从控件继承并在其中添加您的状态。

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();
        }
    }
});

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

最新更新