Announcement

Collapse
No announcement yet.

Entwurfsproblem: JTextfield und DocumentListener

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Entwurfsproblem: JTextfield und DocumentListener

    Hallo,

    bei folgendem Szenario stellt sich mir eine Grudsätzliche frage, die ihr mir hoffentlich beantworten könnt:

    Ich habe ein Dialog mit einem Model was das Observer-Pattern umsetzen soll. Darin befindet sich ein JTextField-Objekt.

    An einem JTextfield hängt ja immer ein Document-Object, dessen Veränderungen kann man mit einem Document-Listener abfangen kann. Also,
    die View:

    Code:
    class view extends JDialog  implements Observer {
    
    ...
    JTextField a = new JTextField();
    a.addDocumentListener(controller)
    ...
    
    public void update(Observable obs, Object obj) {
    
     a.setText(model.getText());
    
    }
    Der Controller:
    Code:
    class controller imlements DocumentListener {
    
     void changedUpdate(DocumentEvent e) {}
     void insertUpdate(DocumentEvent e) {
        model.setText( e.getDocument() ... );
     }
     void removeUpdate(DocumentEvent e)  {
        model.setText( e.getDocument() ... );
     }
    }
    Das Model:
    Code:
    class model extends Observable {
    
     String text;
    
     setText(String text) {
    
      this.text = text;
      setChanged();
      notifyObservers();
    
     }
    
     getText() {   return text; }
     
    }
    Wenn ich das so umsetze, dann ergibt sich eine Endlosschleife: Sobald man eine Eingabe macht ergibt sich eine Veränderung im Document des JTextFields, also bekommt der DocumentListener bescheid, der ein DocumentEvent erzeugt. Im Controller wird dieser in der insertUpdate() - Methode abgefangen, und die Veränderung an das Model weitergeleitet.
    Das Model ändert seine Eigenschaft und veranlasst alle angemeldeten Views per notifyObservers dazu ihre Darstellung upzudaten. Dieses Update erzeugt wiederum ein DocumentEvent ect...

    Wo wäre es am saubersten diese Endosschleife zu durchzubrechen? Durch eine Abfrage in update() ob eine Veränderung auch tatsächlich eine ist? Das wäre schon ein Overhead, da man bei jeder Veränderung Daten aus dem gesammten Dialog einholen und kontrollieren müsste.
    Oder gilt es in update() vorher abzufangen welche teile des views überhaupt von einer Veränderung betroffen sind und diese dann upzudaten?
    Gibt es irgendwo vielleicht eine Art "elegante Lösung", wie man das Observer-Pattern in Java/Swing genau einsetzt, mit einer Begründung warum man es genau so umsetzt?

    Hoffe ihr könnt mir weiterhelfen...und vielen Dank im vorraus.

  • #2
    Moin!

    DocumentListener würde ich nur zum Abhören verwenden. Schau Dir man DocumentFilter an.

    Beste Grüße,
    Josch.

    Comment

    Working...
    X