2012-09-17 63 views
3

我在使用Java Graphics2D的MVC上對此嘗試發表意見。 我想用一個簡單的例子來讓我的頭部繞過MVC。這是MVC嗎?簡單的Java Graphics2D繪圖程序

我說得對嗎?

Docs here。

http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

http://www.oracle.com/technetwork/articles/javase/index-142890.html

反饋理解歡呼聲。

編輯:下面的代碼現在已經基於Rasmus的反饋和進一步的研究得到修復。

public class App { 

    /* 
    * The view registers as a listener on the model. Any changes to the 
    * underlying data of the model immediately result in a broadcast change 
    * notification, which the view receives. 
    * 
    * Note that the model is not aware of the view or the controller -- it 
    * simply broadcasts change notifications to all interested listeners. 
    * 
    * The controller is bound to the view. This typically means that any user 
    * actions that are performed on the view will invoke a registered listener 
    * method in the controller class. 
    * 
    * The controller is given a reference to the underlying model. 
    */ 
    public static void main(String[] args) { 
     Model model = new Model(); 
     Controller controller = new Controller(model); 
     View view = new View(controller); 
     model.addModelChangedListener(view); 

    } 
} 

import java.awt.Rectangle; 
import java.util.ArrayList; 
import java.util.Iterator; 

public class Model { 

    private ArrayList<Rectangle> rectangles = new ArrayList<Rectangle>(); 
    private ArrayList<ModelChangedEventListener> listeners = new ArrayList<ModelChangedEventListener>(); 

    public void addRectangle(int x, int y, int width, int height) { 
     rectangles.add(new Rectangle(x, y, width, height)); 
     modelChangedEvent(); 
    } 

    public ArrayList<Rectangle> getRectangles() { 
     return rectangles; 
    } 

    public synchronized void addModelChangedListener(
      ModelChangedEventListener listener) { 
     listeners.add(listener); 
    } 

    public synchronized void removeModelChangedListener(
      ModelChangedEventListener listener) { 
     listeners.remove(listener); 
    } 

    private synchronized void modelChangedEvent() { 
     ModelChangeEvent event = new ModelChangeEvent(this); 
     Iterator<ModelChangedEventListener> i = listeners.iterator(); 
     while (i.hasNext()) { 
      ((ModelChangedEventListener) i.next()).handleModelChange(event); 
     } 
    } 

} 

import java.awt.Container; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.util.EventObject; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class View extends JFrame implements ModelChangedEventListener { 

    private static final int DISPLAY_WIDTH = 300; 
    private static final int DISPLAY_HEIGHT = 300; 
    private ViewPanel viewPanel; 
    private Controller controller; 

    public View(Controller controller) { 
     this.controller = controller; 
     setSize(DISPLAY_WIDTH, DISPLAY_HEIGHT); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     Container contentPane = getContentPane(); 
     viewPanel = new ViewPanel(); 
     contentPane.add(viewPanel); 
     setVisible(true); 
    } 

    @Override 
    public void handleModelChange(EventObject e) { 
     viewPanel.repaint(); 
    } 

    public class ViewPanel extends JPanel implements MouseListener { 

     public ViewPanel() { 
      addMouseListener(this); 
     } 

     public void paintComponent(Graphics g) { 
      Graphics2D g2 = (Graphics2D) g; 
      controller.draw(g2); 
     } 

     @Override 
     public void mouseClicked(MouseEvent arg0) { 
      controller.click(arg0.getX(), arg0.getY()); 
     } 

     @Override 
     public void mouseEntered(MouseEvent arg0) { 
     } 

     @Override 
     public void mouseExited(MouseEvent arg0) { 
     } 

     @Override 
     public void mousePressed(MouseEvent arg0) { 
     } 

     @Override 
     public void mouseReleased(MouseEvent arg0) { 
     } 

    } 

} 

import java.awt.Graphics2D; 
import java.awt.Rectangle; 

public class Controller { 

    private Model model; 

    public Controller(Model model) { 
     this.model = model; 
    } 

    public void click(int x, int y) { 
     model.addRectangle(x, y, 25, 25); 
    } 

    public void draw(Graphics2D g2) { 
     for (Rectangle rectangle : model.getRectangles()) { 
      g2.draw(rectangle); 
     } 
    } 
} 

import java.util.EventObject; 

public interface ModelChangedEventListener { 
    public void handleModelChange(EventObject e); 
} 

public class ModelChangeEvent extends java.util.EventObject { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 

    public ModelChangeEvent(Object source) { 
     super(source); 
    } 
} 

回答

3

你弄錯了。 MVC的一個要點是使模型獨立於視圖。即模型不應該瞭解這個觀點(或者應該不需要關心)。另一方面,視圖需要使用模型對象來完成它的事情。我從來沒有設計過使用MVC的非Web應用程序。該視圖通常是JSP/HTML/XHTML/XML文件,其作用是使程序以某種方式查找。因此,所有關於渲染,放置等的內容都適用於視圖。控制器的工作是從模型中收集數據,並以視圖可以簡單使用的形式傳遞給視圖,並處理視圖之間的導航等事情。這是將視圖和模型保持在一起的粘合劑。因此:

該模型取決於沒有。 控制器取決於型號。 該視圖取決於控制器和型號。

+0

謝謝。我更改了代碼來解決一些誤解。 –