Ist das MVC korrekt?

Status
Nicht offen für weitere Antworten.
M

Magussi

Gast
Also bezüglich Trennung von Gui und Daten. Eigentlich hab ich nur 2 simple klassen:

Code:
public class Gui3 extends JFrame {
    private JPanel panel1;
    private JPanel panel2;
    private JPanel panel3;
    private JPanel panel4;
    private JPanel panel5;
    
    private JLabel label1;
    private JLabel label2;
    
    
    private JMenuBar menubar = new JMenuBar();;
    
    private javax.swing.JTable jTable = null;
    
    
    
    
    public Gui3() {
        super ("Tele-Notes");
        setLocation(200,250);
		setSize(480, 240);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
		
		setJMenuBar(menubar);
		menubar.add(createFileMenu());
        menubar.add(createFileMenu2());
		
		panel1 = new JPanel();
		panel2 = new JPanel();
		panel3 = new JPanel();
		panel4 = new JPanel();
		panel5 = new JPanel();
		
		Date datum = new Date();
		datum.getDate();
		String zeitstring = datum.toString();
		
		
		
	    
		
		label1 = new JLabel("03:05 min");
		label2 = new JLabel(zeitstring);
		
		panel1.setLayout(new GridLayout(2,1 ));
		
		panel1.add(panel2);
		panel1.add(panel3);
		
		panel2.setLayout(new GridLayout(2,1));
		
		 
		
		panel2.add(panel4);
		panel4.setBorder(BorderFactory.createTitledBorder("Gesprächszeit"));
		panel2.add(panel5);
		panel5.setBorder(BorderFactory.createTitledBorder("Datum"));
		
		panel4.add(label1);
		panel5.add(label2);
		
		
	
		TableModel model = new TableModel();
		jTable = new JTable(model);
		jTable.setSelectionBackground(Color.red);
		
		
		
		jTable.addMouseListener(new java.awt.event.MouseAdapter() { 
            public void mouseClicked(java.awt.event.MouseEvent evt) { 
                 JPopupMenu popmenu = new JPopupMenu();
                 JMenuItem item1 = new JMenuItem("Bearbeiten");
                 JMenuItem item2 = new JMenuItem("Mail");
                 JMenuItem item3 = new JMenuItem("Rückruf");
                 JMenuItem item4 = new JMenuItem("Notiz erstellen");
                 popmenu.add(item1);
                 popmenu.add(item2);
                 popmenu.add(item3);
                 popmenu.add(item4);
                 
                 popmenu.show( evt.getComponent(), evt.getX(), evt.getY() );
                 int a = jTable.getSelectedRow() ;
         		 System.out.println(a);
         		
                 
            }
        });
		
		panel3.setBorder(BorderFactory.createTitledBorder("Anruf-Daten"));
		panel3.add( new JScrollPane( jTable ) ); 
		
		getContentPane().add(panel1);
		setVisible(true);
		
		
		
    }
    
    private JMenu createFileMenu()
    {
         JMenu menu1 = new JMenu("Datei");
         
         JMenuItem mi;
         mi = new JMenuItem("Öffnen");
         menu1.add(mi);
         
         mi = new JMenuItem("Speichern");
         menu1.add(mi);
         
         mi = new JMenuItem("Beenden");
         menu1.add(mi);
         
         return menu1;
    }
    
    private JMenu createFileMenu2()
    {
         JMenu menu2 = new JMenu("Zeit");
         
         JMenuItem mi;
         mi = new JMenuItem("Öffnen");
         menu2.add(mi);
         
         mi = new JMenuItem("Speichern");
         menu2.add(mi);
         
         mi = new JMenuItem("Beenden");
         menu2.add(mi);
         
         return menu2;
    }
    
    
    
    public static void main(String[] args) {
        try {
 			UIManager.setLookAndFeel(
 			UIManager.getSystemLookAndFeelClassName());
 		}
 		catch (Exception e) {}
 		
 		Gui3 tool = new Gui3();
 	}
    
}

Code:
import javax.swing.table.AbstractTableModel;

/**
 * @author Venus
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

     public class TableModel extends AbstractTableModel	{ // Klasse erweitert AbstractTableModel
    	protected String[] columnNames = new String[] {"Name", "Firma", "Nummer", "E-Mail"};
    	protected Class[] columnClasses = new Class[] {String.class, String.class, String.class, String.class};
    	
    	Object [] name = {("Meier"),("Hans"),("Venus")};
    	Object [] firma = {("Sparkasse"),("Fiducia"),("Tolina")};
    	Object [] nummer = {("6542533"),("01725559863"),("01733672998")};
    	Object [] email = {("meier@test.de"),("hans@gmx.de"),("robertvenus@gmx.at")};
    	
    	
    	
    	public int getColumnCount() {
    	    return 4;
    	}
    	
    	public int getRowCount() {
      		return name.length;
    	}
    	
    	public String getColumnName(int col) {
    		return columnNames[col];
    }	

    public Class getColumnClass(int col) {
    		return columnClasses[col];
    }	

    public Object getValueAt(int row, int col) { 
        switch (col) {
    		case 0:
    		return name[row];
    		case 1:
    	return firma[row];
    		case 2:
    	return nummer[row];
    		case 3:
    	return email[row];
    		default:
    	return null;
    }
    }
    }
 

Karl

Aktives Mitglied
Hallo,

die Frage ist lustig, natürlich ist das kein MVC. Anderseits ist View und Controller vereint, was
bei Swing üblich ist, also kann man es wohl korrekt nennen.
Was wäre denn inkorrekt? Inkorrekt wäre beispielsweise, Model und Controller zu vereinen, oder
wenn das Model eine Referenz auf die GUI oder den Controller hätte.

BTW: setVisible() im Constructor? Sinnvolle Namensgebung? Ich nehme mal an, dass ist erstmal nur zu Testzwecken, oder?

Gruß,
Karl
 
M

Magussi

Gast
Naja sowas wie ein controller ist ja gar nicht dabei. eigentlich ja nur die gui und ein model mit daten. Ja ist nur für tstzwecke
 

Wildcard

Top Contributor
Karl hat gesagt.:
Was wäre denn inkorrekt? Inkorrekt wäre beispielsweise, Model und Controller zu vereinen, oder
wenn das Model eine Referenz auf die GUI oder den Controller hätte.
Oft hat das Model eine Referenz auf die GUI in Form eines Listeners. Von inkorrekt würd ich da also nicht sprechen.
Hängt von der Art und Weise der Implemetierung ab...
 
B

bygones

Gast
Wildcard hat gesagt.:
Oft hat das Model eine Referenz auf die GUI in Form eines Listeners. Von inkorrekt würd ich da also nicht sprechen.
doch das wäre es... mit MVC will man eben dieses Problem der Referenz von model und GUI vermeiden. Im Model hat weder die GUI noch der Controller was zu suchen !!
 

Wildcard

Top Contributor
deathbyaclown hat gesagt.:
Wildcard hat gesagt.:
Oft hat das Model eine Referenz auf die GUI in Form eines Listeners. Von inkorrekt würd ich da also nicht sprechen.
doch das wäre es... mit MVC will man eben dieses Problem der Referenz von model und GUI vermeiden. Im Model hat weder die GUI noch der Controller was zu suchen !!
Tut mir leid, aber das sehe ich anders.
Die JTable bspw. ist eine View. Ein TableModel ein Model( :wink: ).
Die JTable registriert sich auf dem Model als Listener um auf Datenänderungen reagieren zu können.
Somit hält das Model eine Referenz auf das JTable Objekt (wenn auch nur in Form des Interfaces) und das verstößt NICHT gegen das MVC-Prinzip!
Würde das Model diese Referenz auf das Orginal-Objekt zurückcasten währe das hingegen ein Verstoß, deshalb
Wildcard hat gesagt.:
Hängt von der Art und Weise der Implemetierung ab...

[edit]in anderen Worten: das Model darf die View nicht kennen, aber sehr wohl eine Referenz auf sie halten[/edit]
 
B

bygones

Gast
was ist dann für dich kennen ?

Im eigentlichen Fall kennt das Model die View weder über eine Assoziation noch über eine Abhängigkeit !
Warum auch... das Model ist nur dafür zuständig die Daten zu verwalten. Die View regelt wie sie angezeigt werden und der Controller regelt die Kommunikation -> Model nicht kennen View !!!

das ist für mich MVC !

edit: auch die argumentation des Interfaces ist nicht richtig hier. Alles Sache des Controllers ! Swing hantiert das ganze ein bisschen laxer, aber dennoch ist das das Grundprinzip von MVC
 

Wildcard

Top Contributor
DBAC hat gesagt.:
was ist dann für dich kennen ?
Code:
class Foo implements BarListener{}

class BarModel
{
    private Foo myStolenFoo;
    private ArrayList listeners = new ArrayList();

    addBarListener(BarListener listener)
    {
        listeners.add(listener); //das ist ok. Das Model hat nun eine Referenz auf die View
        if(listener instanceof Foo)
            myStolenFoo=(Foo)listener; //das ist nicht ok, das Model kennt jetzt die View
    }
}

DBAC hat gesagt.:
Im eigentlichen Fall kennt das Model die View weder über eine Assoziation noch über eine Abhängigkeit !

Wikipedia hat gesagt.:
Model
Das Datenmodell enthält die dauerhaften (persistenten) Daten der Anwendung. Das Model hat also Zugriff auf diverse Backend-Speicher wie zum Beispiel Datenbanken. Das Model kennt weder die View noch den Controller, es weiß also gar nicht, wie, ob und wie oft es dargestellt und verändert wird. Änderungen im Model werden allerdings über einen Update-Mechanismus bekannt gegeben, indem ein Event ausgelöst wird. Dazu muß sich zumindest die View als abhängiges Objekt am Model registrieren, um über Datenänderungen informiert zu werden.
 
B

bygones

Gast
whau wikipedia enttäuscht mich ;)

die widersprechen sich doch:
Das Model kennt weder die View noch den Controller, es weiß also gar nicht, wie, ob und wie oft es dargestellt und verändert wird
gegen
Dazu muß sich zumindest die View als abhängiges Objekt am Model registrieren, um über Datenänderungen informiert zu werden
wenn das model und view verlinkt sind damit die Kommunikation klappt - wozu dann bitte einen Controller ???
 

Wildcard

Top Contributor
DBAC hat gesagt.:
wenn das model und view verlinkt sind damit die Kommunikation klappt - wozu dann bitte einen Controller ???
Um die View zu steuern, Datenänderungen am Model vorzunehmen...
DBAC hat gesagt.:
Swing hantiert das ganze ein bisschen laxer, aber dennoch ist das das Grundprinzip von MVC
In Swing wird die View auf dem Model registriert und du sagst selbst das es vom Grundprinzip MVC ist...
Ich gebe zu man kann sich darüber streiten, ich finde nur man sollte die Aussage
DBAC hat gesagt.:
Im Model hat weder die GUI noch der Controller was zu suchen !!
nicht pauschalisieren. Kommt IMHO auf die Sichtweise an. :wink:
Genauso gut kann man drüber streiten ob es korrekt ist in bestimmten Sitationen View und Controller zu verschmelzen, was in Swing mit Vorliebe gemacht wird.
 
B

bygones

Gast
Wildcard hat gesagt.:
Ich finde nur man sollte die Aussage
DBAC hat gesagt.:
Im Model hat weder die GUI noch der Controller was zu suchen !!
nicht pauschalisieren. Kommt IMHO auf die Sichtweise an. :wink:
tu ich aber !! Es ist ein Unterschied zwischen Theorie und Praxis. Nur weil Swing das so macht ist es noch lange nicht der Theorie nach richtig... aber egal, bygones
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben