0

我正在寫一個簡單的使用觀察者模式的Java帆布應用程序,所以我可以創建多個同步窗口(視圖)。但是當我調試時,我遇到了多個視圖同步的問題,但在實際運行時卻沒有同步。觀察者模式的Java MVC不同步的不同意見

任何人都可以幫我出嗎?

這裏是我是如何實現這一點(我把@Hovercraft充滿了鰻魚的意見,並努力創建和發佈一個最小的,完整的和可驗證的示例程序。):

監聽器,這是一個接口:

public interface CanvasListener { 
    void dragMouse(MouseEvent e); 
} 

我有一個模型,用於不斷通知所有聽衆;

public class CanvasModel{ 
    private List<CanvasListener> listeners; 
    //...other functions 
    public void mouseDragged(MouseEvent e) { 
    for(CanvasListener listener: listeners){ 
     listener.dragMouse(e); 
    } 
    } 
} 

視圖實現監聽器,並且我overrided dragMouse功能並實現了帆布:

public class CanvasView implements CanvasListener { 
    private CanvasModel model; 
    private JPanel panel; 

    public CanvasView(CanvasModel myModel) { 
    // some initializations 
    panel.addMouseMotionListener(new MouseMotionAdapter() { 
     public void mouseDragged(MouseEvent e) { 
     model.mouseDragged(e); 
     } 
    }); 
    } 

    @Override 
    public void dragMouse(MouseEvent e) { 
    Graphics g = panel.getGraphics(); 
    g.drawLine(a, b, c, d); //parameters here are not real 
    g.dispose(); 
    } 
} 

而在主類,我創建2個觀。

public static void main(String[] args){ 
    CanvasModel model = new CanvasModel(); 
    new CanvasView(model); 
    new CanvasView(model); 
} 

但是,如果我在一個窗口畫中,只有一個顯示圖形,如圖picture

但如果我跟蹤到了代碼,這兩個窗口反映的圖形,如圖picture

謝謝!

+1

如需更好的幫助,請考慮創建併發布[最小,完整和可驗證示例程序](http://stackoverflow.com/help/mcve)。我們不想看到你的整個程序,而是你應該將你的代碼壓縮到仍然編譯的最小位,沒有額外的代碼與你的問題無關,但仍然表明你的問題。模型不應該調用dragMouse或其他偵聽器方法。它應該簡單地改變它的狀態,然後通過調用通知方法通知監聽器狀態改變,就是這樣。 – 2014-12-03 02:07:44

+0

另外,您的視圖不應該使用通過調用組件上的'getGraphics()'獲得的Graphics對象來繪製,但這是另一個討論的主題。 – 2014-12-03 02:10:48

+0

@HovercraftFullOfEels感謝您的諮詢! – hj690 2014-12-03 02:24:28

回答

1

我不能告訴你什麼是錯的基礎上提供的非編譯代碼,但我可以說:

  • 的CanvasModel是關鍵的程序數據,這裏也許這將是一個List<Point>,或者甚至更好,一個List<List<Point>>。* CanvasModel不應該調用偵聽器方法。所有視圖共享的數據。
  • CanvasModel絕對應該是而不是可以調用任何監聽器或視圖方法,比如你寫它。
  • 相反,監聽/控制應該是調用CanvasModel方法,可以改變CanvasModel的變量的狀態。
  • 然後CanvasModel應該打電話通知方法,使任何類聽其狀態將變更通知。然後
  • 的聽衆可以調用方法來提取從模型(getter方法)的狀態。
  • 和意見將利用這一信息來改變它們的顯示。
+0

Hi @HovercraftFullOfEels,再次感謝所有關於MVC的偉大建議,真的讓我更瞭解它!我試圖改進它,使其更「MVC」:)同時,這裏是我的這個程序的原始代碼,你可以看看,如果你想:) https://www.dropbox.com/sh/crt3kinngy66uvi/AABmAksb8lQBl2oP5qH0P56ga?DL = 0 – hj690 2014-12-03 21:26:02