Frage

Ich habe eine Drop-Down-Box in meiner GUI, die den Inhalt einer Arraylist in einer anderen Klasse zeigt. Neue Objekte können in der GUI zu dem Arraylist an anderer Stelle hinzugefügt werden, so muss ich wissen, wenn es aktualisiert wird, so kann ich das Dropdown-Menü aktualisieren. Von dem, was ich sammeln kann, sind meine beiden Optionen, um die Arraylist-Klasse zu erweitern, damit ich meine eigene Change, um es hinzuzufügen, oder um die Klasse zu machen, die die Arraylist in Frage enthält erweitern beobachtet werden.

, die eine geeignetere Lösung wäre?

War es hilfreich?

Lösung

Die beiden Lösungen werden im Wesentlichen Implementierungen des gleichen Wurzel-Entwurfsmusters (die „Observer“ Muster wie von der Gang of Four definiert.) Im ersten Fall, Sie machen die Arraylist selbst „zu beobachten“, im letzteren Sie sind so dass das Domain-Objekt, das die Array-Liste verwendet „beobachtet werden.“

würde meine Tendenz, diese zu tun: das Domain-Objekt beobachtbar machen. Dies ist in erster Linie, weil Sie schließlich andere Dinge haben, die über das Domain-Objekt (für die die GUI sollte aktualisiert werden.) Ändern könnten, wenn es bereits zu beobachten ist, sind Sie bereit.

Beachten Sie, dass Sie nicht unbedingt java.util.Observable zu verlängern haben -. Sie das Design-Muster, dass ohne dabei implementieren

Andere Tipps

Die Observable Implementierung in Java wird selten verwendet, und nicht zwischen arbeitet gut mit Schaukel. Verwenden Sie stattdessen eine EventListener.

Insbesondere gibt es einen Grund, nicht zu verlängern DefaultListModel direkt wenn die Verwaltung der Inhalte der Liste „an anderer Stelle in der GUI“? Dann wird Ihr Kombinationsfeld eine ComboBoxModel, die Delegierten auf die gleiche ListModel Instanz verwenden könnte, die eigene Implementierung Hinzufügen der Auswahlstatus zu verfolgen.

ich im Sinne so etwas wie diese (aber ich habe es nicht getestet):

final class MyComboBoxModel 
  extends AbstractListModel 
  implements ComboBoxModel 
{

  private final ListModel data;

  private volatile Object selection;

  MyComboBoxModel(ListModel data) { 
    /* 
     * Construct this object with a reference to your list, 
     * which contents are managed somewhere else in the UI.
     */
    this.data = data;
    data.addListDataListener(new ListDataListener() {
      public void contentsChanged(ListDataEvent evt) { 
        fireContentsChanged(this, evt.getIndex0(), evt.getIndex1()); 
      }
      public void intervalAdded(ListDataEvent evt) { 
        fireContentsChanged(this, evt.getIndex0(), evt.getIndex1()); 
      }
      public void intervalRemoved(ListDataEvent evt) { 
        fireContentsChanged(this, evt.getIndex0(), evt.getIndex1()); 
      }
    });
  }

  public void setSelectedItem(Object selection) { 
    this.selection = selection;
    fireContentsChanged(this, 0, data.getSize() - 1);
  }

  public Object getSelectedItem() { return selection; }

  public int getSize() { return data.getSize(); }

  public Object getElementAt(int idx) { return data.getElementAt(idx); }

}

Warum nicht Bindungen verwenden?

http://wiki.eclipse.org/index.php/JFace_Data_Binding

Binden Sie Ihre GUI-Widget auf Ihrer Liste. Die Änderungen werden transparent zwischen den beiden Objekten propagieren. Seien Sie sicher, dass Ihr Modell mit einem geeigneten beobachtbaren wickeln, wie WritableList (wenn die Arraylist mit direkt).

Immer liebe Zusammensetzung über Verlängerung (meine Referenz Effective Java und meine persönliche Erfahrung). Arraylist erstreckt, ist einfach ein Versprechen, dass Sie keine der Klassen Invarianten verletzen. Es bindet auch an die spezifische Liste Implementierung Sie erstrecken.

könnten Sie schalten ein GUI-Entwurfsmuster verwenden. Oder baut eine begrenzte Implementierung.

Erstellen Sie ein GUI-Form-Interface, das eine Methode DrawXArrayList hat (mit X einig meaningfull Namen zu sein. Es hat einen Parameter vom Typ Arraylist

Erstellen Sie eine neue Klasse namens GUIView. Es hat mindestens zwei Methoden: UpdateXArrayList und RegisterForm

Wenn Sie die Anwendung initialisieren hat das GUI-Formular selbst mit der Klasse registrieren GUIView implementieren. Machen Sie die Klasse Umsetzung GUIView das Formular sichtbar.

Wenn irgendetwas in Ihrem GUI-Formular aktualisiert die Arraylist es UpdateXArrayList als das letzte, was nennen habe es tut. Die UpdateXArrayList Methode in der Klasse der Umsetzung GUIView wird dann wiederum Anruf DrawXArrayList die aktualisierte Arraylist übergeben. DrawXArrayList in Form Klasse die GUIFormInterface Implementierung übernimmt dann die Schritte benötigen die Steuerung zu aktualisieren, um die Arraylist angezeigt wird.

Während dies scheint wie eine Menge von Schritten zu einem Beobachter und Zuhörer Setup verglichen. Sie haben mehr Kontrolle darüber, wie die verschiedenen Benutzeraktionen die Benutzeroberfläche bewirken dann die Beobachter-Hörer Muster. Darüber hinaus dokumentiert Sie im Code, die Interaktion zwischen dem Benutzer-Aktion und die Updates der Benutzeroberfläche.

Wenn Sie ein neues Glas zur Anwendung hinzufügen können Besuche verglast Listen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top