2017-01-23 71 views
1

我想在我的程序来实现MVC增加听众JPanels,这是目前我的控制器类:MVC,并包含在其他其它的组件

public class Controller { 

    private DatabaseModel model; 
    private View view; 

    public Controller(View view, DatabaseModel model){ 
     this.model = model; 
     this.view = view; 

     this.view.getMainPanel().getCandidateForm(). 
        addSubmitListener(new CandidateListener()); 
    } 

    class CandidateListener implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      System.out.println("ACTION"); 
     } 
    } 
} 

,因为我认为包括一些私人子JPanels - MainFrame和CandidateForm - 后者是按钮的位置,在第10行,我将候选窗体面板传递回控制器,然后将其称为'addSubmitListener()'方法,该方法将自定义侦听器添加到按钮。

这看起来像是添加侦听器的正确方法吗?我应该如何在Controller中定义CandidateListener?或者可能在子JPanel中创建一个匿名类?

有关MVC和听众的最佳实践的任何其他建议也将不胜感激!

+1

[在Java开发中使用Swing正确实现MVC模式]可能的副本(http://stackoverflow.com/questions/25502552/correctly-implementing-the-mvc-pattern-in-gui-development-using -swing-in-java) –

回答

1

如注意到here,“并非每个交互都需要通过应用程序的控制器。”你的方法不是错误,但它可能缩小比例。考虑使用Action来封装功能,如建议here。在数据库上下文中,此简单example创建Action,它将查询结果选项卡添加到JTabbedPane。这个更详细的example使用SwingWorker在后台查询数据库;相应的Action可能实例化该工作者并​​它。

+0

哇,谢谢。那个数据库的例子特别好。 我并不擅长处理一般的事件,我很新,但这对我有很大的帮助。 至于通过控制器传递的每个交互 - 是为什么在彩色猜测器示例中,您将模型传递给视图? 对于迟到的回复感到抱歉,整件事情都被放在了后面,我忘记了我的问题。但很感谢! – NickW

+0

@nickW:正如本[纲要](http://stackoverflow.com/a/2687871/230513)中所建议的那样,该视图可能会引用该模型。 – trashgod

+0

不错,我一定会再看看。到目前为止,我很享受阅读你的代码示例。 虽然 - 我假设虚线是*不*参考/链接(他们是间接的沟通,对吧?)1快速问题,但对于该图表 – NickW