java - 多线程 MVC 用多个独立仪表重新创建平面仪表板

标签 java multithreading swing model-view-controller

我正在寻求有关 MVC 设计的帮助,我哪里出了问题,以及我缓慢进展的方式是否有意义。

我正在尝试创建这样的东西: enter image description here

许多仪表可以在自己的线程中工作,我的问题是如何正确地将这个程序划分为 View 和模型。

这是我到目前为止的想法:

Controllers
           DashboardController
Models
           BarGaugeModel
           CircularGaugeModel
Views
           Components
                   BarGauge
                   CircularGauge
           DashboardView
ViewModels
           DashboardViewModel
Main
           Main

BarGaugeModel.java

public class BarGaugeModel {
    private int speed;

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }
}

DashboardViewModel.java(将包含所有模型)

public class DashboardViewModel {
    BarGaugeModel fuelGauge = new BarGaugeModel();

    public BarGaugeModel getFuelGauge() {
        return fuelGauge;
    }
}

BarGauge.java

public class BarGauge extends JPanel {
    private JLabel speed = new JLabel();


    public int getSpeed() {
        return Integer.parseInt(speed.getText());
    }

    public void setSpeed(int speed) {
        this.speed.setText(speed+"");
    }
}

DashboardView.java(将创建所有 View 组件并添加到此 jframe)

public class DashboardView extends JFrame {
    BarGauge barGauge = new BarGauge();

    public void DashBoardView(){
        this.setSize(new Dimension(100,100));
        this.add(barGauge);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

Main.java

public class Main {

    public static void main(String[] args) {
        DashboardView dashboardView = new DashboardView();
        DashboardViewModel dashboardViewModel = new DashboardViewModel();
        DashboardController dashboardController = new DashboardController(dashboardView, dashboardViewModel);

        dashboardView.setVisible(true);
    }
}

每个仪表还有一个手动输入供用户输入,我也不太确定该输入应该包含在哪个 View 中,或者可能包含在完全独立的 View 中。

最佳答案

首先,在纯 MVC 中,模型和 View 彼此一无所知,这一切都由 Controller 控制, Controller 充当它们之间的路由器,监听更改并在 View 之间来回转发这些更新以及型号。

作为一般建议,您应该首先定义模型、 Controller 和 View 需要维护的契约,以便它们能够协同工作,就个人而言,我从接口(interface)开始因为这会解耦实现细节,并迫使您专注于“真正”需要做什么,而不是您“可以”做什么,因为实现的副作用(例如, Controller 能够从 View 中添加/删除组件)

这还应该包括所有观察者模式/监听器,这是为发生通信提供通知 channel 所必需的

您可能还想定义什么是线程安全的,什么不是线程安全的,例如,虽然您的“最终”设计可能需要模型从不同线程获取信息,但更新应该在同一线程上生成还是应该它们会同步回单个线程吗?无论如何,谁的责任是实际做到这一点(提示,在大多数情况下,这是观点)

通过这个过程,您应该寻找重叠的细节,这些细节可以进一步简化为通用功能(当可以精炼时,没有必要有两个具有 public int getValue() 的不同模型进入单个通用接口(interface) ...在大多数情况下)

当您不需要时,我也会小心地转换“数据”,例如在您的 BarGauge 类中,您会获取速度,该速度以 int< 形式给出,但将其转换为 String,就个人而言,我会将其保留为 int 并简单地更改呈现方式,这样可以省去很多麻烦并且 View 的责任应该是呈现状态,因此我倾向于将其保留为原始格式,并且仅在需要时将其转换以进行呈现。

在做这样的事情时,我尝试做的事情之一就是关注谁负责什么,例如......

当更新来自线程时,它会进入模型,模型根据线程的输入更新其状态,它通知 Controller , Controller 通知 View 然后更新

线程 -> 模型 -> Controller -> View

当用户输入数据时,数据通过 View 传递到 Controller , Controller 通知模型,模型更新其状态,这反过来可能会生成一个回程,以便 View 可以根据模型的决定进行 self 更新与输入有关(即拒绝它或修改它或因为它更新了模型的某些其他状态)

用户 -> View -> Controller -> 模型 {-> Controller -> View }

dividing into smaller views and then putting this back together does it make sense to create view components as JPanels as simple gauges and then combine them into one view in JFrame as I have shown in the question?

一般来说,是的,但是您需要了解的一件事是 View 可以充当其他 Controller 的 Controller - 这意味着您可以有一个“控制面板” View ,它实际上是其他 Controller 的容器仪表控件(假设您允许 Controller 公开 View 和模型)

我要做的是从 Controller (可能还有 View )的基本概念开始

public interface View {
    public JComponent getView();
}

public interface Controller<M, V extends View> {
    public M getModel()
    public V getView();
}

这意味着我可以将任意数量的“ Controller ”传递到我的“控制 Pane ” View ,它可以获取每个“ View ”并将它们添加到自身以显示......作为基本想法。

关于java - 多线程 MVC 用多个独立仪表重新创建平面仪表板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42519585/

相关文章:

与集合和泛型相关的 Java 10 迁移问题

Java 字符串与命令行参数

c++ - 池化线程的 SetThreadAffinityMask

java - 方形不在我的 Swing 应用程序中旋转

java - 组合 n 个列表列表保存顺序(Java)

python - 守护线程在 Python 3.5.1 中有何用处?

java - 获取java中的 Activity 线程数

Java/Swing - 工具提示矩形

java - 在 JCheckBox 中有一个左右对齐的标签

Java Swing 复选框