2011-01-10 8 views
3

Ich stoße gerade mit der Idee, ein kleines/mittleres Projekt von AWT zu SWT zu konvertieren, obwohl Swing noch nicht ganz aus dem Bild ist. Ich habe über das Konvertieren des Hauptfensters in ein SWT_AWT-Brückenobjekt nachgedacht, aber ich habe keine Ahnung, wie die Semantik dafür funktioniert. Danach plane ich den Dialog für den Dialog zu aktualisieren, aber nicht unbedingt in einem Release. Ist das möglich?Umwandlung einer AWT-Anwendung in SWT/JFace

Hat jemand eine Konvertierung wie diese gemacht und kann mir ein paar Tipps geben? Gibt es vielleicht irgendwo irgendwo ein Tutorial? Gibt es vielleicht sogar ein Werkzeug, das Teile davon automatisieren kann? Ich habe versucht zu googeln, aber ohne Erfolg.

Update: Eine zusätzliche Sache ist: Derzeit ist dies ein Netbeans-Projekt. Könnte mir helfen oder nicht, ich weiß es nicht.

+0

Netbeans Projekt: was meinst du: verwenden Sie Netbeans als Plattform oder als IDE? – Mot

+0

"das Hauptfenster, ein Objekt, das von einem JFrame abgeleitet ist" Ich hasse es zu sagen, aber ['javax.swing.JFrame'] (http://download.oracle.com/javase/6/docs/api/javax/ swing/JFrame.html) ist keine AWT-Klasse ... – Powerlord

+0

Danke Bemrose, ich bin mit zwei Projekten verwirrt. – data

Antwort

3

Wir haben das schon einige Male gemacht. Aber nur, weil wir von einer Swing-Anwendung zu einer Eclipse RCP-Anwendung nicht gehen, weil wir gerne mit Dingen zu tun haben. Dieses Projekt wird Sie wirklich wissen lassen, ob Sie Ihren Controller/Modellcode von Ihrem Ansichtscode getrennt haben.

Ein Vorschlag ist, nicht alles auf einmal zu versuchen und umzuwandeln. Sie werden mit einer Reihe von gemischten Code enden, der überhaupt nicht funktioniert. Sie können damit beginnen, Portale zu konvertieren. Ich würde ein Portal in einem Tab, Dialog oder Fenster als im Wesentlichen eigenständige Einheit betrachten. Wenn Sie ein Fenster haben, das sich öffnet, erstellen Sie das Fenster in SWT, aber machen Sie es zum bestehenden AWT/Swing. Dies sollte ziemlich geradlinig sein und Ihnen erlauben, sich daran zu gewöhnen (ich hoffe wirklich, dass sie nicht betrunken waren und einen guten Grund dafür hatten), Eltern/Kind-Steuerelemente zu instanziieren und zu assoziieren.

Ein Gotcha, das auftreten kann, ist mit transparenten Komponenten. Swing mit Ausnahme einer "Fenster" -Klasse wird in Java gerendert. Dies macht es sehr einfach, die Dinge so zu gestalten, wie Sie es möchten.In SWT gibt es einige Einschränkungen:

  • Grenzen. Wenn Sie SWT.BORDER verwenden, bleiben Sie bei jeder Farbe hängen, die die native Komponente verwendet. Am besten verwenden Sie einen PaintListener und rendern eigene Ränder, wenn Sie sie in einem anderen Stil oder einer anderen Farbe verwenden möchten.
  • Transparente Etiketten, Fortschrittsbalken. Ich war nicht in der Lage, Etiketten oder Fortschrittsbalken mit einem transparenten Hintergrund zu versehen. Wenn Sie möchten, dass sie die Elternfarbe oder Zeichnung übernehmen, müssen Sie den Text und andere Steuerelemente selbst rendern.
  • Kontrollen. In SWT gibt es Komposite und Kontrollen. Stellen Sie sich Controls als grundlegende native Steuerelemente vor, die alle nativen API-Aufrufe ausführen. Diese können nicht unterklassifiziert werden, was die Dinge schwierig macht.
  • Tabellen werden Ihnen die meisten Probleme bereiten. Stellen Sie sicher, dass alles stabil ist, bevor Sie versuchen, eine JTable in eine Tabelle oder einen TableViewer zu konvertieren. Sie werden einige Zeit damit verbringen, besonders wenn Sie benutzerdefinierte Editoren und Viewer haben.

Ich habe nicht erforscht, warum SWT wurde so konzipiert, wie es war. Ich vermute, da musste ein guter Grund sein. Es wäre toll, wenn jemand einen Blog oder eine Verteidigung zu seinem Design hätte, also muss ich nicht danach suchen. Sobald es veröffentlicht ist, werde ich diese Zeilen entfernen, da sie für die Frage keine Relevanz haben.

Zusatz

ich hinzufügen möchten, da Sie ein vorhandenes Produkt habe ich Arbeiten übernehmen. Der beste Ratschlag, den ich Ihnen geben kann, ist, dass Sie Ihren Code niemals in einen Zustand versetzen, den er nicht kompilieren und ausführen kann. Wenn Sie an Ihrer Konvertierung arbeiten und alles, was Sie einchecken, immer läuft und ausführt (trotz der visuellen Unterschiede zwischen SWT/AWT/Swing), ersparen Sie sich auf lange Sicht viele Kopfschmerzen. Das Schlimmste, was Sie tun können, ist, dies alles auf einmal zu lösen und Ihren Code wochenlang in einen instabilen Zustand zu versetzen.

1

Ich würde vorschlagen, es in ein WindowBuilder Projekt zu importieren, da WindowBuilder Ihnen die Möglichkeit gibt, vorhandenen Code zu analysieren und ein GUI-Mock-up zu erstellen und dann Komponenten zu SWT oder Swing zu morphen.

1

Wenn Sie daran denken, eine Kombination aus SWT und Swing in derselben Anwendung zu verwenden, wird this Eclipse Corner Article immens nützlich sein.

0

Wir bereiten den gleichen Schritt vor: Swing zu SWT/JFace. Zuerst versuchen wir, die Engpässe zu ermitteln: spezielle Komponenten aus JComponent mit SWT/JFace neu zu implementieren, suchen nach einem Ersatz von JIDE-Docking (wir wollen SWT/JFace, nicht RCP verwenden, um zu viel Ärger zu vermeiden). Das Schlimmste, was wir uns bereits vorstellen, ist, dass Sie in Swing Komponenten erstellen und später zum übergeordneten Element hinzufügen können. Mit SWT ist dies nicht möglich: Die übergeordnete Komponente muss als Verweis auf den Konstruktor der untergeordneten Komponente übergeben werden. Dies erfordert ein umfangreiches Refactoring in der Swing-Anwendung, bevor SWT verwendet wird.

Ehrlich gesagt, bewerten wir die Konvertierung eine sehr schwere Veränderung, weil wir die Zeit erwarten, wo nichts als ziemlich lang kompiliert werden kann. Wir versuchen diese Zeit zu reduzieren, indem wir alles so gut wie möglich vorbereiten, aber wir werden sehen, wie gut es funktionieren wird.

Update vom 6. April 2011:

Wir Refactoring jetzt unsere Swing-Anwendung immer Komponenten mit ihren Eltern (wie in SWT) zu erstellen. Unsere Unterklassen von JFrame und JDialog wurden nur auf referenced eine JDialog Instanz, um es einfacher zu SWT Shell zu wechseln. Parallel schreiben wir anspruchsvolle Komponenten in SWT um.

+0

Ihr Code sollte immer kompilieren. Niemals, lassen Sie Ihren Code niemals in einen Zustand kommen, in dem ein Entwickler es nicht auschecken und kompilieren kann, und es wird erfolgreich ausgeführt. Bitte vertraue mir darauf und denke darüber nach. –

+0

Ja, normalerweise entwickeln wir so, aber wie geht das bei einer so großen Veränderung? Ich denke, dass es nicht möglich ist Swing/AWT Schritt für Schritt durch SWT/JFace in einer nicht-trivialen Anwendung zu ersetzen. – Mot