【问题标题】:Correct MVC approach when using paintComponent使用paintComponent时正确的MVC方法
【发布时间】:2018-10-28 14:42:28
【问题描述】:

我想尝试使用paintComponent制作一个示例交通灯程序,但我对它的MVC方法有点困惑,2个问题:

我用框架(视图)引擎(模型)和 JButton(控制器)制作了它,它们将打开/关闭灯。

对我来说,最简单的方法是让我的控制器直接与视图通信,通过调用 toggle(); (一种将布尔“活动”切换为真/假“的方法),在视图上,然后在视图上调用 repaint();。这个 repaint 方法将检查它是否处于活动状态,然后根据是否处于活动状态绘制不同的东西真假。

第一个问题是,MVC 标准可以接受吗?我会说是的,因为它只是在绘图,但是我认为视图方法中不应该有计算,检查“活动”是否考虑了计算?

更好的解决方案是在模型中创建一个方法,然后可以在视图上调用 toggle() 方法,因为它在技术上会更改数据?还是直接从控制器更改它更好。在较小的场景中当然更容易,但我可以看到它是否会在较大的解决方案中造成混淆。

不确定这个问题是否足够清楚,请告诉我,我会尝试提供更多信息。

【问题讨论】:

    标签: java swing model-view-controller


    【解决方案1】:

    对我来说,最简单的方法是让我的控制器直接与视图通信,通过调用 toggle(); (一种将布尔“活动”切换为真/假“的方法),在视图上,然后在视图上调用 repaint();。这个 repaint 方法将检查它是否处于活动状态,然后根据是否处于活动状态绘制不同的东西真假

    不好,因为这会从你的程序中完全删除模型,而模型是 MVC 的关键。 除非你说活动字段是你的整体模型,它使你的 MVC 变得微不足道。

    在模型中创建一个方法,然后可以在视图上调用 toggle() 方法'

    不,这是不可接受的,因为 MVC 的一个关键是模型必须完全不了解视图。

    按钮应该不是控件,而是绝对视图的一部分。然而,它的侦听器要么是控件,要么与已按下按钮的控件通信。然后控制通知模型决定它是否应该改变状态。应该有一个由控件附加到模型的侦听器,然后它会更改视图以反映模型的状态。

    【讨论】:

    • 嗨,我很抱歉,我的意思是听者而不是按钮。 w
    • 正确的解决方案是:按钮侦听器调用模型上的方法来更改视图中的一些数据,然后模型调用视图上的方法来重新绘制/重新验证它
    • @anders12232323:不。正如我在上面所说的,模型不应该直接改变视图。完成 MVC 后,我已将模型连接到允许侦听器(如上所述),这些侦听器将改变视图。
    • @anders12232323:给你的模型一个 SwingPropertyChangeSupport 并允许它按照this answer接受监听器
    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 2011-08-06
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多