22. maj 2001 - 21:52Der er
6 kommentarer og 1 løsning
Model View Control
Jeg arbejder med en client/server applikation, hvor client siden er bygget i JBuilder vha. swing komponenter. JBuilders data aware komponenter er altså ikke benyttet.
Jeg vil opdatere data modellen hvergang der indtastes i et JTextField, og ligeledes vil jeg gerne have at eventuelle ændringer i modellen afspejles i GUI\'en.
Hvilke listeners kan benyttes? Jeg har ikke ligefundet nogle på JTextField, der kan bruges. Hvad gør man så? Implementerer sin egen eller finder nogen der har gjort det?
I et inbound callcenter, hvor identiteten på den, der ringer ind, skal bekræftes, kan kontrollen nu foregå i telefonkøen. Det understøtter fem centrale KPI'er for callcentre.
Et JTextField har et underliggende Document som datamodel for data. På den kan du registrere dig som DocumentListener og modtage insertUpdate(DocumentEvent), changedUpdate(DocumentEvent) eller removeUpdate(DocumentEvent) når der sker noget.
min datamodel består af en række klasserder arver fra BizObj (en del af JFramework fra oop). Hvis jeg skal bruge Document som model kræver det at objekterne i min datamodel både arver fra frameworket og implementere Document samt metoder til at reflektere alle attributter i et konkret document -- så får jeg en temmelig kompleks datamodel :(
Er det måden? Jeg kunne nemlig godt tænke mig at MVC arkitekturen var mere usynlig i datamodellen.
Nej hurtigste mulighed er byg en eller flere adapter klasse(r) mellem dit textfields document, og din data model, som vist nedenunder.
Jeg har gjort metoderne synkroniseret, hvis du skulle have flere tråde. Hvis der kun er en, så fjern synkroniseringen.
class MyAdapter implement DocumentListener, PropertyChangeListener { private JTextField field; private MyModel model; public MyAdapter(JTextField aField, MyModel aModel) { field = aField; model = aModel; field.getDocument().addDocumentListener(this); model.addPropertyChangeListener(this); }
// From documentlistener public synchronized void changeUpdate(DocumentEvent e) { model.removePropertyChangeListener(this); model.setText(e.getText()); // Whatever, get the hint? model.addPropertyChangeListener(this); } .. + de andre
// from propertychangelistener public synchronized void propertyChanged(PropertyChangeEvent e) { field.getDocument().removeDocumentListener(this); field.setText(e.getText()); // Again, whatever. field.getDocument().addDocumentListener(this); } }
... Now, somewhere in code. public static void main(String[] args) { aModel = new WhateverModel(); aField = new JTextField(); new MyAdapter(aField, aModel); // Connect the two }
OK jeg kan godt lidt løsningen, fordi den er simpel og overskuelig -- du får den.
Imidlertid bryder jeg mig ikke om den måde model og field bliver opdateret på :( Kan det virkelig kun gøres ved at først afmelde som listener, derefter tilmelde igen? -- Men det kan jeg jo så selv fedte lidt rundt med..
Adapteren fungerer som controller i mvc, så semantisk er det jo også i orden.
Afmelding og tilmelding skyldes jo, at hvis du stadig var documentlistener mens du programmatisk sætter værdien i tekstfeltet, ville du blive notificeret umiddelbart efter i samme adapter, hvorefter du ville delegere ændringerne tilbage til modellen, som så ville notificere adapteren igen, som så vil sætte tekstfeltet etc... Derfor slipper vi lige i perioden vi updater.
Bemærk, at mellem remove og add skal du lave så lidt så muligt, så hvis du skal udlede data etc, så gør det før du kalder removelistener, så der kun er en enkelt set metode mellem remove og add.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.