Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Dec 2006

Java Trassel

Hej, har lyckats trassla till det för mig och hoppas att någon kan hjälpa mig ur det.

Det är som så att jag har ett antal klasser, och på de har jag tillämpat Observer, actionlistner och lite.

Men nu är det som så att jag har skapat en klass till, men hur ska jag då kunna använda mig utav detta?

Koden är nedminskad men borde ändå förklara vad jag är ute efter.

Min första class:

public View(Model model, Controller controller) { this.model = model; this.controller = controller; model.addObserver(this); JButton btnOpen = new JButton("Open"); btnOpen.addActionListener(controller); btnOpen.setActionCommand("Open"); } public void update(Observable obs, Object arg) { } public static void main(String[] args) { Model model = new Model(); Controller controller = new Controller(model); View view = new View(model, controller); view.setVisible(true); }

Jag har alltså en actionlistner i Controller som kommer här:

public class Controller implements ActionListener, MouseListener, ListSelectionListener { public Controller(Model model) { this.model = model; } public void actionPerformed(ActionEvent e) { // if("Open".equals(e.getActionCommand())) model.open();

Som sen går till model för att skapa en ny JFrame

public class Model extends Observable { private openNewFrame oNF; private void open(){ oNF.rectangle(); oNF.setVisible(true); }

Här kommer sen mitt dilemma, i min nya klass som jag har skapat här vill jag kunna använda mig utav samma actionController som i tidigare classer, nämligen min class Controller. Men jag förstår inte hur jag skulle kunna lägga in den så om någon skulle kunna hjälpa mig här skulle jag bli väldigt glad för man måste ju kunna ska flera olika klasser och ändå använda sig utav samma observer och actionlistner eller?

import javax.swing.*; import java.awt.*; import java.awt.event.ActionListener; import java.util.Observable; import java.util.Observer; import model.*; import controller.*; public class newFrame extends JFrame implements Observer{ JButton btnSave = new JButton("Save"); btnSave.addActionListener(controller);//Här kommer jag inte åt controller btnSave.setActionCommand("btnSave");

Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problem:
controller cannot be resolved

Är felet jag får upp, någon som skulle kunna hjälpa mig att få detta att fungera?
Alltså så att jag får controller att fungera som lyssnare i både View och newFrame?

Mitt problem är helt enkelt kopplat till att jag vill öppna en ny Frame. Det har alltid fungerat bra med sålänge jag bara använt mig utav en Frame till programmet men nu skulle jag alltså vilja implementera ytterligare en Frame och då vet jag inte hur jag ska göra för att komma åt controller.
Jag har försökt med några mystiska små idéer men jag kan verkligen inte komma på hur man ska göra.
Jag har t.ex. försökt lägga in

Model model = new Model(); Controller controller = new Controller(model);

i konstruktorn för newFrame osv men det är bara ett av de usla försök jag prövat så nu hoppas jag på lite bättre hjälp från er
Tack på förhand!

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

Nu är jag riktigt dålig på det här med MVC (beställde en bok om ämnet senast igår! ) men jag försöker mig på en analys ändå:

Jag tycker inte du ska öppna din frame från Model; modellen är tänkt att fungera som ett dataåtkomstobjekt -- den hämtar i sin tur datan från en databas, en fil, privata variabler etc -- och ska inte ha kännedom om vare sig Controller eller View[s].
Jag skulle istället låta View ta hand om detta samt ändra metodnamnet från "open" till något i stil med parseEvent() eller kanske actOnEvent() (jag suger på förklarande metodnamn).

Varför detta? Jo, ponera att du bestämmer dig för att köra applikationen i en textbaserad miljö. Det enda du vill göra i detta fall är att byta ut View. Detta skulle inte fungera om du öppnar framen från Model; då skulle även denna behöva bytas ut och då faller hela konceptet med strukturseparation.

Metod open()s namn antyder även att något just öppnas, ett fönster, en bild eller vad det nu kan vara. Genom att byta namn till något mer generellt behåller koden sin uttrycksfullhet utan att binda sig till en specifik handling. Kanske vill du i en annan View inte alls öppna ett nytt fönster vid eventet utan istället skriva ut en text. I detta fall blir open() missvisande.

Ergo: Låt View ansvara för öppnandet av en ny JFrame... tror jag Någon med mer insikt än mig får gärna kommentera och förtydliga då även jag vill lära mig mer om denna designprincip.

Bilanaloger är som Volvo — varenda svenne kör med dem