2012-09-17 1 views
3

Java Graphics2D를 사용하여 MVC에서이 시도에 대해 의견을 남겨주세요. 간단한 예제를 사용하여 MVC로 돌아가고 싶었습니다.이 MVC입니까? 간단한 자바 Graphics2D 드로잉 프로그램

내가 맞았습니까?

여기에 있습니다.

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를 염두에두고 비 - 웹 애플리케이션을 설계 한 적이 없다. 뷰는 일반적으로 JSP/HTML/XHTML/XML 파일이며, 그 역할은 프로그램을 특정 방식으로 보이게하는 것입니다. 그래서 렌더링, 배치 등에 관한 모든 것이보기에 들어 맞습니다. 컨트롤러 작업은 모델에서 데이터를 수집하여 뷰가 간단한 방식으로 사용할 수있는 형식으로 뷰에 전달하고 뷰 간 탐색 같은 것을 처리하는 것입니다. 그것은보기와 모델을 함께 유지하는 접착제입니다. 따라서 :

모델은 아무런 영향을받지 않습니다. 컨트롤러는 모델에 따라 다릅니다. 보기는 컨트롤러 및 모델에 따라 다릅니다.

+0

고맙습니다. 내 오해를 수정하기 위해 코드를 변경했습니다. –