Netbeans Matisse vs. Java Interfaces + CDI

Alles was mit Swing und AWT zu tun hat

Moderatoren: wegus, Olek77

Antworten
astahlhofen
Beiträge: 3
Registriert: 08.10.2013, 06:55

Netbeans Matisse vs. Java Interfaces + CDI

Beitrag von astahlhofen » 08.10.2013, 08:43

Hallo zusammen,

ich schreibe aktuell eine GUI Anwendung und verwende das MVP (Model-View-Presenter) Pattern. Um die verschiedenen Komponenten schnell und komfortabel zusammenzufügen, verwende ich Matisse innerhalb von Netbeans. Jetzt bin ich aber auf das folgende Problem gestoßen:

Ich habe mir ein Interface View definiert mit folgenden Methoden:

Code: Alles auswählen

public interface View<P> {
    void init();
    Component asUIComponent();
    void setPresenter(P presenter);   
}
Wenn ich jetzt eine spezielle View implementiere, erzeuge ich mir zunächst ein weiteres Interface, welches das Interface View erweitert, z.B. eine DefaultView:

Code: Alles auswählen

public interface DefaultView extends View<DefaultView.Presenter> {
    public interface Presenter {
        void init();
        // Wetiere Interface-Methoden ...
    }

    // Weitere Interface-Methoden ...
}
Die implementierende Klasse sieht dann in etwa so aus:

Code: Alles auswählen

public class DefaultViewImpl extends JPanel implements DefaultView {
   ...
}
Wenn ich die DefaultView jetzt beispielsweise in einem JFrame verwenden möchte, verwende ich als Typ natürlich das Interface (lose Kopplung usw. ;-)) und rufe dann beim Hinzufügen die Methode "asUiComponent()" auf. Erschwerend kommt noch hinzu, dass ich CDI (Contexts and Dependency Injection) verwende und der relevante Code in meiner JFrame Klasse letztendlich in etwa so aussieht:

Code: Alles auswählen

public class MainFrame extends JFrame {
    @Inject
    private DefaultView defaultView;

    ...

    public void init() {
        ...
        add(defaultView.asUIComponent());
        ...
    }
}
Ich habe schon gelesen, dass man prinzipiell jede Java-Klasse als Custom Component in Matisse verwenden kann. Voraussetzung dafür ist jedoch, dass ein Default-Konstruktor existiert und die Klasse nicht abstrakt ist. Gibt es dennoch irgendeine Vorgehensweise, wie man mittels Matisse den oben stehenden Code (oder etwas ähnliches) automatisch durch "Zusammenklicken" erzeugen kann? Wichtig ist eben die lose Kopplung, so dass ich die Implementierung (in diesem Fall DefaultViewImpl) ohne Probleme austauschen kann.

Leider reicht mein Wissen bzgl. Netbeans und Matisse noch nicht aus, um das Problem einschätzen zu können, denn ich bin erst kürzlich von Eclipse auf Netbeans umgesattelt. Dennoch wollte ich einmal im Forum nachhören, ob vielleicht schon jemand mit einem ähnlichen Problem konfrontiert war.

Vielen Dank schon einmal vorab und beste Grüße,
Andi

shaman
Beiträge: 5
Registriert: 18.09.2013, 12:34

Re: Netbeans Matisse vs. Java Interfaces + CDI

Beitrag von shaman » 13.10.2013, 09:01

Hallo astahlhofen,

ich würde das Problem so angehen: Du kannst Matisse verwenden, um die einzelnen Views zu designen. (Tust du warscheinlich schon).
Beim zusammenführen in ein JFrame hatte ich einmal ein ähnlichen Fall. Ich hab es so gelöst, dass ich lehre Container für die einzelnen Views
in Matisse angelegt habe (z.B. JPanel, JTabbedPane, ...). (Bei JTabbedPane kannst du die Anzahl der Views sogar nachträglich ändern / pro View ein Tab hinzufügen).
Nach der initComponents()-Methode fügte ich dann die einzelnen Views in die
einzelnen Container ein (gefolgt von setPreferedSize). So konnte ich das Frame und die Views voneinander trennen und trotzdem mit Matisse
designen.
Vielleicht funktionniert dieser Ansatz auch in deinem Fall.

shaman

astahlhofen
Beiträge: 3
Registriert: 08.10.2013, 06:55

Re: Netbeans Matisse vs. Java Interfaces + CDI

Beitrag von astahlhofen » 22.10.2013, 20:26

Hallo shaman,

danke für die Antwort. Das Konzept hört sich gut an. Habe es inzwischen ausprobiert und praktiziere das bei meinem Projekt jetzt so. Das hat mir sehr geholfen!

Vielen Dank nochmal und beste Grüße,
Andi

Antworten