2014-02-28 91 views
1

我在C#ASP.net和PHP CodeIgniter + Laravel的Web应用程序中广泛使用了MVC模式,但现在我必须为Java Swing应用程序实现它,并且当它实际上是从事件动态添加元素(如JPanel)到视图。在任何Web MVC框架中,我只会返回一个局部视图并将其注入到div中。更多解释:Java Swing MVC动态组件

我有一个视图只有一件事:MainController侦听的按钮。当我点击按钮时,视图告诉控制器调用方法“buttonClicked()”。这样做的结果应该是创建一个JPanel并将其添加到视图中,但是如何在Java Swing MVC中执行此操作?就像我说的,在一个Web MVC框架中,我可能会做类似“返回新的partialView(模型)”的东西。

因为唯一应该依赖于Swing框架的类是Views,所以我知道JPanel是在那里创建的,但不是控制器(或模型)应该告诉视图放置它的位置?这是如何运作的?

谢谢。我希望通过思考足够清楚,我只是从Java开始。

+0

感谢您的快速回复,但我想我没有清楚地传达我想要的东西。所以,我在视图中已经有了一个BoxLayout,但是我想知道的是:在将新JPanel添加到窗口的过程中,控制器的角色是什么?当视图创建JPanel并使用模型填充字段时,它是否简单地传递JPanel数据(名称,文本等)? 而当我在实际的“buttonClicked()”方法中,如何对视图“添加新的JPanel”说?我在模型中调用某种“更新()”方法吗? 谢谢 – user3363635

回答

0

原则上,模型应该关注输出的所有逻辑和处理物理。在这种情况下,这是由用户输入引起的主视图JPanel状态的变化。因此,模型和模型本身就是业务。但是,控制器的工作是将该更改传递给视图,并且视图仍然负责显示更改。这样,MVC模型的单一职责原则就可以维持。

这里有一种方法可以做到这一点:

查看:

  • 实现,它接受一个JPanel参数视图类的方法,相当于它的视图对象的面板和更新的UI面板(例如newPanelUpdate(JPanel panel){...})。

型号:

  • 添加新JPanel领域与它的 'getter和setter方法'(如newPanel)。

控制器:

  • 实现,一旦按钮被点击的actionListener,会从模型中得到新的JPanel的值,并将其传递的newPanelUpdate()方法的参数。

主要课程:

  • 在这里,您创建要显示出来,一旦按钮被点击,并在模型中它设置的JPanel领域的新JPanel。

此方法假定您将只使用3个类来表示模型,视图和控制器。实际上,模型的实现可能不那么方便,但仍然会按照相同的原则运行。

0

你不需要你的情况下的模型。只需将面板添加到控制器中的视图。让你的模型使用JPanels或Gui组件将违反你首先使用MVC的原因。

buttonClicked() { 
    mView.add(new JPanel()); 
} 

如果您想即存储的你有多少面板在你看来一个int,那么你可以实现起来包括具有功能addPanel该整数模型()。然后你buttonClicked()看起来是这样的:

buttonClicked(){ 
    mModel.addPanel(); 
} 

Model.addPanel(){ 
    amountPanels++; 
    setChanged(); 
    notifyObservers(); 
} 

在这种情况下,您的浏览将是一个观察员,并添加面板的更新()

@Override 
update() { 
    add.(new JPanel()); 
}