我正在寫一個簡單的使用觀察者模式的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
謝謝!
如需更好的幫助,請考慮創建併發布[最小,完整和可驗證示例程序](http://stackoverflow.com/help/mcve)。我們不想看到你的整個程序,而是你應該將你的代碼壓縮到仍然編譯的最小位,沒有額外的代碼與你的問題無關,但仍然表明你的問題。模型不應該調用dragMouse或其他偵聽器方法。它應該簡單地改變它的狀態,然後通過調用通知方法通知監聽器狀態改變,就是這樣。 – 2014-12-03 02:07:44
另外,您的視圖不應該使用通過調用組件上的'getGraphics()'獲得的Graphics對象來繪製,但這是另一個討論的主題。 – 2014-12-03 02:10:48
@HovercraftFullOfEels感謝您的諮詢! – hj690 2014-12-03 02:24:28