2011-05-04 85 views
2

我的應用程序的目的,我需要創建一個應該表現和應對相同的事件數相同的看法。我是否應該對每個需要的相同視圖進行instanciate,並在控制器中保存這個視圖列表,或者有更好的方法來處理這個視圖?謝謝。MVC與幾個相同的看法

回答

2

從我的理解......你應該按照你的想法。

有您安裝到控制器的視圖列表。如果事件發生,請通過視圖列表並更新所有視圖。

EDIT1:這裏是展示它可能會如何做一個很簡單的例子。

import java.awt.Color; 
import java.awt.Component; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.util.ArrayList; 
import java.util.List; 
import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class ManyViewsTest 
{ 
    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      @Override 
      public void run() 
      {    
       View v1 = new View(); 
       View v2 = new View(); 
       View v3 = new View(); 
       View v4 = new View();    
       View v5 = new View();    
       JPanel contentPane = new JPanel(); 
       contentPane.add(v1); 
       contentPane.add(v2); 
       contentPane.add(v3); 
       contentPane.add(v4); 
       contentPane.add(v5); 
       JFrame f = new JFrame(); 
       f.setContentPane(contentPane); 
       f.setSize(800, 600); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       Controller c = new Controller(f); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 

class Controller 
{ 
    private List<View> views; 

    public Controller(JFrame f) 
    { 
     this.views = new ArrayList<View>(); 
     f.addMouseListener(mL); 
     for(Component c: f.getContentPane().getComponents()) 
     { 
      if(c instanceof View) 
       views.add((View)c); 
     } 
    } 

    public void updateView(String text) 
    { 
     for(View v: views) 
      v.setLabelText(text); 
    } 

    private MouseListener mL = new MouseAdapter() 
    { 
     int pressCounter = 0; 
     @Override 
     public void mousePressed(MouseEvent e) 
     { 
      super.mousePressed(e); 
      updateView("mousePressed, pressCounter="+(++pressCounter)); 
     }          
    }; 
} 

class View extends JPanel 
{ 
    private static final long serialVersionUID = 1L; 
    private JLabel label; 
    public View() 
    { 
     this.label = new JLabel("Initialized"); 
     label.setBorder(BorderFactory.createLineBorder(Color.GREEN)); 
     add(label); 
    } 
    public void setLabelText(String text) 
    { 
     label.setText(text); 
    } 
} 
+0

感謝您爲例。 – LionO 2011-05-04 17:54:14

+0

@LionO沒問題,希望對你有用。祝你好運 – Boro 2011-05-04 17:55:16

+0

+1在這個例子中,隱式_model_是一個'List '。在更典型的實施方式中,_controller_收聽_model_並通知任何註冊_view_進行自我更新,如圖[這裏](http://stackoverflow.com/questions/3066590/gui-problem-after-rewriting-to-mvc/3072979#3072979)。 – trashgod 2011-05-04 20:05:53

相關問題