可以控制其他视图吗?

时间:2014-03-14 13:56:56

标签: java model-view-controller

我正在实现我自己的基本MVC框架,我有一个类似图形的视图,它显示了一堆点,如散点图。这是一个简化版本:

public class GraphView extends View 
{
    private List<Point2D> points;

    //view code

    public void setPoint(int index, float x, float y)
    {
        points.get(index).setLocation(x,y);
    }

    public int getNumPoints()
    {
        return points.size();
    }
}

我还有一个视图,它使用这个视图作为子视图,带有一些额外的控件,其中一个是随机化图形视图上的点的按钮。

public class GraphControlsView extends View 
{
    private GraphView graph;
    private JButton randomizeButton;

    //view code

    //called by the button
    public void randomize()
    {
         for(int i = 0; i < graph.getNumPoints();i++)
         {
             graph.setPoint(i,Math.random(),Math.random());
         }
    }
}

我想知道这是逻辑在图表视图上随机化点的正确位置。看起来我正在混合视图和控制器的职责,并且这个逻辑应该驻留在控制器中。但是,如果我将逻辑移动到控制器中并且只是有一个按钮监听器,那么控制器可以使用该按钮来执行它不打算做的事情,尽管它有一个&#34; Randomize&#34;标签就可以了。

简而言之,GraphControlsView应该直接控制它的GraphView子视图吗?或者是否应该有一个控制器来监听GraphControlsView并在GraphView上设置点?

1 个答案:

答案 0 :(得分:0)

应用MVC模型时,应该在模型中保留所有用户输入处理。视图仅涉及输出显示和用户界面,而模型处理程序的“物理”。控制器在两者之​​间中继数据并使它们保持不同。通过这种方式,您可以更好地分离关注点。 记住这一点,您的点随机化逻辑应该在Model类中实现。然后将结果中继到显示它的图形视图。

对于执行超出期望的按钮,技术上不应该发生这种情况。假设每个按钮都分配给一个特定的任务,它应该有自己的动作命令。在实现动作侦听器时,如果事件的set动作命令是分配给相应按钮的命令,则需要确保编写条件以执行所需的代码。您可以通过调用JButton的setActionCommand()方法来设置action命令。您可以通过调用actionPerformed()方法的Event参数的getActionCommand()方法由动作侦听器检查它。

如果您需要更多说明,请告诉我。