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

时间:2017-02-28 22:04:22

标签: java multithreading swing model-view-controller

我正在寻找有关我的MVC设计的帮助,我哪里出错了,如果有的话,那就是我慢慢进步的方式。

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

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

这是我到目前为止所提出的:

public class BarGaugeModel {
    private int speed;

    public int getSpeed() {
        return speed;
    }

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

BarGaugeModel.java

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

    public BarGaugeModel getFuelGauge() {
        return fuelGauge;
    }
}

DashboardViewModel.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+"");
    }
}

BarGauge.java

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);
    }

}

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

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);
    }
}

Main.java

{{1}}

这些仪表中的每一个也都有一个手动输入供用户输入,我也不太确定该输入应该包含在哪个视图中,也可能完全独立。

1 个答案:

答案 0 :(得分:2)

首先,在纯MVC中,模型和视图对彼此一无所知,这一切都由控制器控制,控制器充当它们之间的路由器,监听更改并在视图之间前后转发这些更新和模型。

作为一般建议,您应该首先定义需要由模型,控制器和视图维护的合同,以便它们一起工作,就个人而言,我从interfaces开始,因为这种解耦实现细节并强制你专注于“真正”需要做什么,而不是你“可以”做什么,因为实现副作用(例如控制器能够从视图中添加/删除组件)

这还应该包括所有观察者模式/听众,这是为了提供通信发生的通知渠道所需要的

您可能还需要定义什么是线程安全的,哪些不是,例如,当您的“终极”设计可能需要模型从不同线程获取信息时,如果在同一线程上生成更新或应该他们被同步回一个线程?无论如何,实际上是谁的责任是什么(暗示,在大多数情况下,这是观点)

通过这个过程,您应该寻找重叠的细节,这些细节可以进一步简化为通用功能(当可以将这些模型简化为单个公共{{1}时,没有任何点具有public int getValue()的两个不同模型在大多数情况下......)

在您不需要时,我也会小心转换“数据”,例如在您的interface课程中,您采取的速度是BarGauge,但是转向把它变成int,个人而言,我会把它留作String而只是改变你呈现它的方式,它会省去很多麻烦,而且观点责任应该是呈现状态,所以我倾向于将其保留为原始格式,只在需要时将其转换为演示文稿。

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

当更新来自线程时,它进入模型,模型根据线程的输入更新其状态,它通知控制器,控制器通知视图然后更新

int

当用户输入数据时,数据通过视图传递给控制器​​,控制器通知模型,模型更新其状态,这反过来可能会生成返回行程,因此视图可以根据模型决定的内容自行更新与输入有关(即拒绝或修改它或因为它更新了模型的其他状态)

Thread -> Model -> Controller -> View

  

分成较小的视图,然后将其重新组合在一起将视图组件创建为JPanels作为简单的仪表,然后将它们组合到JFrame中的一个视图中,如我在问题中所示?

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

我会做的是从User -> View -> Controller -> Model {-> Controller -> View}(可能是Controller)的基本概念开始

View

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