Avatar billede faceorbit Nybegynder
22. maj 2001 - 21:52 Der 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?

Alternative ideer er velkomne
Avatar billede logical Nybegynder
22. maj 2001 - 22:13 #1
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.

Du kan sikkert selv tage den herfra.
Avatar billede faceorbit Nybegynder
22. maj 2001 - 22:34 #2
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.
Avatar billede logical Nybegynder
22. maj 2001 - 23:05 #3
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
}

Avatar billede faceorbit Nybegynder
23. maj 2001 - 09:16 #4
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..

tak og buk

Avatar billede logical Nybegynder
23. maj 2001 - 09:23 #5

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.
Avatar billede faceorbit Nybegynder
23. maj 2001 - 09:24 #6
jeg er ikke helt sikker på at jeg fik accepteret
dit svar rigtigt?? Ellers sig lige til, du skal selvfølgelig have point\'ene
Avatar billede logical Nybegynder
23. maj 2001 - 09:35 #7
Jo, det gik fint nok! held og lykke med det.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester