Java Swing MVC动态组件

Java Swing MVC动态组件,java,swing,user-interface,model-view-controller,Java,Swing,User Interface,Model View Controller,我已经在C ASP.net和PHP CodeIgniter+Laravel中的web应用程序中广泛使用了MVC模式,但现在我必须为java Swing应用程序实现它,当涉及到实际动态地将元素(如JPanel)添加到事件视图时,我有点不知所措。在任何Web MVC框架中,我只需返回部分视图并将其插入div。更多说明: 我有一个视图,它只有一个东西:主控制器监听的按钮。当我单击按钮时,视图告诉控制器调用方法buttonClicked。这样做的结果应该是创建一个JPanel并将其添加到视图中,但是在J

我已经在C ASP.net和PHP CodeIgniter+Laravel中的web应用程序中广泛使用了MVC模式,但现在我必须为java Swing应用程序实现它,当涉及到实际动态地将元素(如JPanel)添加到事件视图时,我有点不知所措。在任何Web MVC框架中,我只需返回部分视图并将其插入div。更多说明:

我有一个视图,它只有一个东西:主控制器监听的按钮。当我单击按钮时,视图告诉控制器调用方法buttonClicked。这样做的结果应该是创建一个JPanel并将其添加到视图中,但是在JavaSwingMVC中如何做到这一点呢?正如我所说,在WebMVC框架中,我可能会执行类似于返回新partialViewmodel的操作

因为应该依赖于Swing框架的类只有视图,我知道JPanel是在其中创建的,但是控制器或模型不应该告诉视图将其放置在哪里吗?这是怎么回事


谢谢。我希望我的想法足够清晰,我只是从java开始。

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

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

视图:

在view类中实现一个方法,该方法接受一个JPanel参数,将其等同于view对象的panel,并更新panel的UI例如。newPanelUpdateJPanel面板{…}。 型号:

添加一个新的JPanel字段,例如带有“setters和getter”的newPanel。 控制器:

实现一个actionListener,一旦单击按钮,它将从模型中获取新的JPanel值,并将其作为newPanelUpdate方法的参数传递。 主程序:

在这里,您创建了一个新的JPanel,您希望在单击按钮后显示它,并将模型中的JPanel字段设置为它。
此方法假定仅使用3个类来表示模型、视图和控制器。实际上,模型实现可能不那么方便,但仍将按照相同的原则运行。

在您的案例中,您不需要模型。只需将面板添加到控制器内的视图中。让您的模型使用JPanels或其他Gui组件将违反您首先使用MVC的原因

buttonClicked() {
    mView.add(new JPanel());
}
如果您希望存储视图中有多少个面板的int,那么您可以实现一个包含该整数的模型和一个函数addPanel。然后,您的按钮被选中,如下所示:

buttonClicked(){
    mModel.addPanel();
}

Model.addPanel(){
    amountPanels++;
    setChanged();
    notifyObservers();
}
在这种情况下,您的视图将是一个观察者,并在其更新中添加面板

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

谢谢你的快速回复,但我想我没有清楚地表达我想要什么。因此,我在视图中已经有了一个BoxLayout,但我想知道的是:在向窗口添加新JPanel的过程中,控制器的角色是什么?当视图创建JPanel并使用模型填充字段时,它是否只传递JPanel数据名、文本等?当我使用实际的buttonClicked方法时,如何向视图添加一个新的JPanel?我是否在模型中调用某种更新方法?谢谢