RCP Application Model - Änderungen erfolgen nicht

Ronschk

Mitglied
Hi,
Ich bin jetzt von Eclipse 3.7 auf 4.2 umgestiegen, leider hänge ich hier schon seit Ewigkeiten an dem Problem, dass die Änderungen, die ich in dem Application Model mache (Größe vom Trimmed Window ändern z.B) nicht angewendet werden.
Installiert habe ich 4.2, dazu E4 CSS Spy und Eclipse e4 Tools. Danach Erstelle ich ein Project mittels file-new-Eclipse 4-Eclipse4 Application Project. In dem Wizard ändere ich lediglich den Namen.
Dann starte ich das Project über die Product Datei - Launch an Eclipse Application. Danach ändere ich das Application Model, speichere es und starte das Product nochmal, aber nichts ändert sich. Was mache ich falsch? So viel ist das ja wirklich nicht :p


Ach ja und noch ein zweites Problem: Bei der neuen 4.2 SR1 Version kommen beim Erstellen zwei Hinweise:
"egit could not detect where git is installed"
und
"die HOME variable wurde nicht gesetzt"
Soweit ich das jetzt gesehen habe muss man Git doch nicht nutzen? Warum erscheint dann eine Fehlermeldung und was für Auswirkungen hat es wenn ich Git nicht installiere? (Und wenn es wichtig ist, warum ist es nicht mitinstalliert?)
 
G

Gast2

Gast
Launch an Eclipse Application. Danach ändere ich das Application Model, speichere es und starte das Product nochmal, aber nichts ändert sich. Was mache ich falsch? So viel ist das ja wirklich nicht :p
Weil der UI Zustand in deinen Preferencen abgespeichert wird. Darum werden die Änderungen nicht übernommen. Es gibt ein Befehl das abzustellen, musst mal googeln.
Oder du löscht deinen runtime-workspace wenn du die Anwendung ausführst musst in der launch config eine checkbox setzen.

Ach ja und noch ein zweites Problem: Bei der neuen 4.2 SR1 Version kommen beim Erstellen zwei Hinweise:
"egit could not detect where git is installed"
und
"die HOME variable wurde nicht gesetzt"
Soweit ich das jetzt gesehen habe muss man Git doch nicht nutzen? Warum erscheint dann eine Fehlermeldung und was für Auswirkungen hat es wenn ich Git nicht installiere? (Und wenn es wichtig ist, warum ist es nicht mitinstalliert?)

Darum sind es auch Hinweise...
 

Ronschk

Mitglied
hm okay werde ich mal machen. Aber wo ist der Sinn dahinter, dass es gespeichert wird? Das ist doch kein seltenes Ereignis, dass ich das Application Model ändere(?)
 
G

Gast2

Gast
hm okay werde ich mal machen. Aber wo ist der Sinn dahinter, dass es gespeichert wird? Das ist doch kein seltenes Ereignis, dass ich das Application Model ändere(?)

Während der Entwicklung ist das vielleicht normal, aber der Endanwender wird das Model wohl nicht mehr ändern? Der will die Größe und das Verschieben von den PartStacks einmal machen und das soll beim nächsten Aufruf auch wieder so sein.
 

Ronschk

Mitglied
Der Endanwender kann auf das Application Model zugreifen? Oder meinst Du als Endanwender einen der mein erstelltes Plugin o.ä. in seine Software einbinden wird?
 
G

Gast2

Gast
Der Endanwender kann auf das Application Model zugreifen? Oder meinst Du als Endanwender einen der mein erstelltes Plugin o.ä. in seine Software einbinden wird?

häää? ???:L

Der Modelzustand wird (soviel ich weiß) einfach persisitiert .

Du wirst Eclipse 4 zum Entwickeln nehmen. Da stellst du einmal die Größe, Position usw. von deinen PartStacks ein z.B. JavaEditor, Package Explorer usw. Und das wird im Model gespeichert oder willst du das jedesmal neu einstellen müssen.
Machst jedes mal deine IDE auf und die ist in der Werkseinstellung.
 

Ronschk

Mitglied
ah okay. verstanden, danke!
Ich hatte halt nicht gedacht, dass die Darstellungsänderungen die der Nutzer macht im ApplicationModel stehen, sondern... naja darüber habe ich nicht wirklich nachgedacht. Ich dachte das ApplicationModel wäre ein reines Entwicklertool.
Das Tut habe ich nicht ganz durch, da ich jetzt erst auf 4 umgestiegen bin. Das 3er habe ich durch. Da jetzt durch die dependency Injection und Events und so noch recht viel dazu gekommen ist, lese ich da nur ab und zu etwas nach und mache stattdessen ein anwendungsbezogeneres Tut.

Ähm wo wir gerade von DI sprechen... kennst Du dich da zufällig aus? Ich will eigentlich ungerne ein neues Topic aufmachen, aber ich komme mit den Erklärungen die ich bisher gefunden habe nicht ganz zurecht.
Also das Prinzip ist ja, dass man Unabhängigkeit von Klassen erzeugt. Anstatt, dass man in Klasse A eine Instanz von Klasse B erzeugt (mittels new), erstellt man.. naja so ne Art Zeiger (wie heißt das in Java?) und lässt die Instanz dann von außen befüllen. Klingt soweit ganz gut. Aber wie passiert das?

Also ich habe eine Klasse A
Code:
public class A{
@Inject B instanzVonKlasseB
....

Und von dieser Klasse A möchte ich in Klasse C eine Instanz erstellen. Dann wird irgendwoher eine Instanz von B genommen und "instanzVonKlasseB" zugewiesen, so dass ich dieses verwenden kann ohne über "new" eine neue Instanz erzeugen zu müssen? Aber woher wird diese Instanz genommen?

edit: vielleicht wird sich das Problem mit dem nächsten Tut lösen...
 
Zuletzt bearbeitet:
G

Gast2

Gast
und lässt die Instanz dann von außen befüllen. Klingt soweit ganz gut. Aber wie passiert das?

Es gibt einen DI-Container, der das für dich erledigt und in den du deine Klassen reinstecken kannst. Gleiches Tutorial Punkt 25.3
Ich erkläre dir DI nicht, da gibt es jede Menge gute Bücher ;) .
 

Ronschk

Mitglied
mir fallen langsam vom lesen die Augen aus ^^ Komme irgendwie kaum voran, weil immer was neues kommt :p
Habe jetzt noch zwei weitere Tuts durch (das hier kann ich empfehlen: Eclipse 4 (e4) Tutorial Part 4- Dependency Injection Basics EclipseSource Blog), und so langsam erschließt sich mir einiges. Aber eine Frage musst Du mir doch beantworten :D

Wenn ich das Composite in nem Constructor injecte:
Code:
@ Inject
public void MyView (Composite parent) {
//Implement the View placed on the Parent
}

muss ich die Klasse doch trotzdem so aufrufen:

Code:
...
MyView view = new MyView(shell);
...
 
G

Gast2

Gast
muss ich die Klasse doch trotzdem so aufrufen:

Code:
...
MyView view = new MyView(shell);
...

Ja klar warum sollst die Klasse nicht so aufrufen müssen?
Alle Klassen die nicht im DI Container sind musst du ganz normal selber aufrufen und auch die Abhängigkeiten mitgeben.

Wenn du einen DI Container hast solltest du nie selber mehr ein new aufrufen müssen, weil das genau der Container für dich machen soll.
 

Ronschk

Mitglied
ja aber was genau bringt wir dann das @Inject vor dem Konstruktor? Ich dachte das Framework sucht dann in den verschiedenen Bereichen (part, perspective, workbench etc) nach einem Composite, welches passt und fügt das an der Stelle ein? So ist es doch für die Attribute. Wenn ich
Code:
@Inject KlasseA neuesA
schreibe, sucht Eclipse nach einer passenden Instanz und fügt sie ein, so dass ich direkt neuesA nutzen kann ohne
Code:
neuesA = new KlasseA
zu schreiben.
Aber was passiert bei einem Konstruktor?
 
G

Gast2

Gast
Ich versteh nicht was du meinst. Es passiert genau das gleiche wenn der DI Container eine Klasse erzeugt gibt er dir ein passendes Objekt rein genau wie am Feld. Wie gesagt du rufst selber kein new auf!!!

Es gibt 3 Arten von DI
- Setter Injection
- Constructor/Method Injection
- Field Injection

Du musst dir bewusst sein, dass du deine Klassen so schreiben solltest, dass man sie auch ohne DI verwenden kann z.B. zum Unit Testen d.h. Field Injection ist nicht immer so toll, weil dann eventuell viele NPE bekommst.
 

Ronschk

Mitglied
Sorry, dass ich so schwer von Begriff bin, aber es hat immer noch nicht klick gemacht.
Vielleicht mal anhand eines einfachen Bsps:

Code:
public class eineKlasse{

  @Inject
   private andereKlasse nameAB;

  @Inject
  public eineKlasse(Composite einComposite){
     Label lbl = new Label( einComposite, SWT.NONE);
     lbl.setText("hi");
  }

}

Also der Container sucht mir doch jetzt für ' andereKlasse ' ein Object, so dass ich in einer Funktion (wobei dies nicht der Konstruktor sein sollte) einfach schreiben kann
Code:
  andereKlasse.funktionAB()
ohne ein new zu verwenden.

Da sehe ich den Sinn direkt.
Wenn ich jetzt in einer anderen Klasse ' eineKlasse ' aufrufen möchte, muss ich es immernoch mit '... = new eineKlasse (composite) ' machen.
Soweit hätte mir DI beim Konstruktor nichts gebracht, oder?
Das einzige, was ich mir vorstellen konnte, was ich allerdings auch schon getestet habe ist der Fall, dass ich in einer anderen Klasse
Code:
   public class nochNeAndereKlasse{
    
    @Inject
       eineKlasse nameXY;

   public funktion(){
      nameXY.funktionXY();
   }

}

eine Instanz von eineKlasse erstellen kann ohne new zu verwenden. So dass mir das @Inject vor den Attributen der Klasse 'eine Klasse' direkt was bringt (ich kann innerhalb der Klasse auf Elemente zugreifen ohne new zu verwenden), das @Inject vor dem Konstruktor aber nur etwas bringt, wenn ich Instanzen von eineKlasse innerhalb einer anderen Klasse erstellen will.

Meine Vermutung habe ich allerdings schon getestet und sie funktioniert nicht. Was also bringt im konkreten fall das new vor dem Konstruktor? Von dem 'einComposite' muss Instanz mittels 'new' erstellt werden, weil eine Instanz beim Aufruf übergeben wird.

Ich hoffe, ich konnte die Unklarheiten jetzt gut darstellen :p
 
G

Gast2

Gast
Du verstehst den Sinn nicht du wirst nie ein new aufrufen !!!
Das new wird für dich aufgerufen Inversion of Control ? Wikipedia
So dass beide "ungefähr" das gleiche machen, für dich am Anfang macht es das gleiche... Wenn du eine Weile damit gearbeitet hast wirst vielleicht verstehen, was der Unterschied zwischen den 3 Arten ist...

hier mal bissle was zu lesen:
Chapter 3. The IoC container
Dependency Injection with the Spring Framework - Tutorial




KlassenSchreibtManGross
Java:
public class NochNeAndereKlasse{
    
    @Inject
       eineKlasse nameXY;

   public funktion(){
      nameXY.funktionXY();
   }

}
Sowas ist schlecht weil jeder der nun diese Klasse ohne DI verwendet wird immer eine NPE bekommen...
Also ist es besser Constructor Injection oder Method Injection zu verwenden, aber ist wohl für Fortgeschrittene ;)
 
Zuletzt bearbeitet von einem Moderator:

Ronschk

Mitglied
Lang ists her, habe mich jetzt ein wenig weiter damit beschäftigt und ich denke so langsam komm ich darauf klar (vielen Dank für deine Hilfe!!) :) (wobei ich mir nicht explizit die Spring tuts durchgelesen habe, weil ich eben Spring nicht verwende. Ich hab mich an Eclipse 4 (e4) Tutorial Part 4- Dependency Injection Basics EclipseSource Blog gehalten (wir ziemlich gut erklärt) und versucht mir die Funktion anhand von Beispiel Code anzueignen.

Was übrigens sehr zur Entwirrung beigetragen hat war, dass man z.B. so etwas
Code:
MPart part = partService.createPart("ModelURI");
verwenden kann um das 'new' zu umgehen.



So jetzt habe ich ein paar weitere Fragen:
angenommen ich möchte wie oben gesagt per ...create... eine neue Instanz von etwas erstellen. Wie kann ich das mit eigenen Klassen von mir machen? Ich muss sie ja zu dem Framework hinzufügen..(?)
Und was hat es genau mit diesen M-Klassen (MPart z.B.) auf sich? Ich finde leider keine Klassenbeschreibung auf der Eclipse Seite dazu.

Außerdem möchte ich gerne eine Art globalen GUI-Controller erstellen. Er soll Dateien laden, zwischen GUI und Repositpory korrespondieren usw. Ich habe jetzt zuerst an ein singleton gedacht aber ich denke, dass eben das genau mit DI bewerkstelligt werden soll.
Ich würde also gerne eine selbst geschriebene Klasse injecten können und sichergehen können, dass es nur eine Instaz von ihr gibt
 

Ronschk

Mitglied
Ah ich glaube zum zweiten Teil habe ich die Lösung gefunden.
Um eigene Klassen vom DI-Context erstellen zu lassen muss man "@Creatable" vor die Klasse schreiben
Code:
@Creatable
public class....

Damit wird dann eine Instanz erstellt, wenn keine gefunden wird. Und wenn sie dann einmal erstellt ist, sollte sie ja immer gefunden werden können -> es wird nur eine Instanz von ihr geben
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D IPerspectiveFactory in einer e4 application Plattformprogrammierung 2
Z Remote Application Platform - Fragen über Fragen und keiner weiß nichts genaues Plattformprogrammierung 5
L RCP Exception beim Ausführen von BIRT Application Plattformprogrammierung 2
T Application+Swing Plattformprogrammierung 2
L RAP Application export? Plattformprogrammierung 4
N Application & Product Infocenter und eigene TOC Plattformprogrammierung 7
M Eclipe RCP-Application oder Plugin Einstieg Plattformprogrammierung 6
dzim Kontrolliertes Beenden einer Application Plattformprogrammierung 7
K RCP Application, mit der Zeit JavaOutOfMemoryException Plattformprogrammierung 7
dzim eigene Application und PlugIns Plattformprogrammierung 16
D OSGi JSR296 (Swing Application Framework) - Konzeptionsfrage Plattformprogrammierung 2
M EMF Model Transaction Fehler beim Updaten eines Graphiti-Pictogramms Plattformprogrammierung 2
G EMF Model auf xsd Element mit eIsSet prüfen Plattformprogrammierung 15
Z EMF ecore model updaten Plattformprogrammierung 5
S RCP Anfängerfrage - Zusammenspiel View, Editor, Model Plattformprogrammierung 4
G Eclipse Modelling Framework - Java Code aus Model erzeugen. Plattformprogrammierung 2
A Eclipse undo/redo button reagiert nicht auf Änderungen in der OperationHistory Plattformprogrammierung 5
P Eclipse speichert keine Änderungen Plattformprogrammierung 5
M RCP Aktivierung eines CommandHandlers, Änderungen in der plugin.xml wirken sich nicht aus... Plattformprogrammierung 2
J GMF Änderungen werden nicht übernommen Plattformprogrammierung 4

Ähnliche Java Themen


Oben