2011-05-04 82 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

相关问题