Swing Docking Widgets selber machen?

mjdv

Bekanntes Mitglied
Hey Leute,

ihr kennt doch sicher diese Docking Widgets, die man im ganzen Programmfenster an beliebiger Stelle positionieren und teils auch gruppieren kann. Solche, die man heute in fast jeder IDE hat.

Für jemanden der noch nicht weiß was gemeint ist hier ein kleines Video: YouTube - qt dockable ui example

Naja, nun meine Frage, wie kann so was selber in Java implementieren, ich meine man kann ja auch MDI Programme bauen, da sollte es doch eigentlich auch möglich sein so etwas einzubauen?

Ich weiß, dass es schon viele solcher ramewokrs gibt, doch möchte ich gerne wissen wie man so etwas selber machen kann.
Bin für jeden Tipp dankebar ;)
 

mjdv

Bekanntes Mitglied
Joa, ich weiß ^^

aber wie gesgat ich will ja eins selbst machen :D Und diese Frameworks sind für den Anfang doch ein wenig Overkill, so dass ich mich nur schwer in den Code einarbeiten kann :/
 

mjdv

Bekanntes Mitglied
Also ich habe mir jetzt mal ein paar Sourcen angesehen, aber blicke da nicht wirklich durch.

Mir ist bloß aufgefallen, dass die von Grund auf neue Sachen dafür entwickelt haben. Z.B. werden bei eigentlich jedem Framework die TabbedPanes neu gemacht, ohne auf JTabbedPane irgendwie zurück zu greifen.

Meine Frage ist, könnte man vielleicht als Basis für Docking Widgets, die JDesktopPane mit InternalFrames hernehmen? Musste doch eigentlich gehen, man muss nur einen eigenen LayoutDesigner schreiben und das DragnDrop der JInternalFrames ein wenig verändern.
Meint ihr, so könnte man da ran gehen?
 
B

Beni

Gast
Als Autor eines solchen Frameworks kann ich vielleicht ein bisschen helfen.

Im meinem Framework habe ich ganz am Anfang eine JTabbedPane als TabbedPane verwendet Dann wollte ich neben den Tabs eine weitere Komponente mit Knöpfen anzeigen Und dann ein Menü falls es nicht genügend Platz hat um alle Tabs anzuzeigen.

Jetzt gab es verschiedene Möglichkeiten:
- irgendwie die JTabbedPane auseinandernehmen, Componenten reinschmuggeln, Tabs überwachen... mit dieser Lösung kommt man ziemlich offensichtlich nicht sehr weit.
- Über das LookAndFeel gehen und eine eigene TabbedPaneUI implementieren. Aber auch da rennt man in Probleme: damit das gut aussieht muss man für jedes LaF eine neue Klasse schreiben. Und die werden ja auch noch weiterentwickelt, greiffen zum Teil auf Resourcen zurück die man nicht so einfach erreicht. Und über seltsame, unvorhergesehene Abhängigkeiten und Lizenzprobleme wollen wir garnicht sprechen.
- Oder man schreibt kurzerhand eine eigene Tabbed-Component. Man ist frei zu tun was man will und verglichen zu den anderen Lösungen benötigt man nicht unbedingt mehr Zeit.

Also: wenn man nur was kleines machen will, kann man mit den Standard-Componenten schon was erreichen. Aber sobald du etwas nicht-standardmässiges machen willst, kriegst du enorme Probleme.
 

mjdv

Bekanntes Mitglied
Okay, danke schon mal.

Das bedeutet also. das ich alles von Grund auf am besten selber implementiere. Geht das denn so "einfach"? Ich weiß nich ganz wie ich bei sowas anfangen soll :D
 
B

Beni

Gast
Mein Vorschlag: schreib dir ein paar Interfaces um verschiedene Implementationen auszuprobieren. Bsp.: ein Interface "TabbedPane" mit Methoden wie "addTab", "removeTab", etc... Zuerst implementierst du das Interface mit Hilfe einer JTabbedPane. Das dauert 10 Minuten. Wenn die Lösung dann zu deinem Projekt passt, wars gut. Wenn nicht, kannst du später immernoch sehr schnell auf eine andere Lösung umschwenken.

Den Titel der JInternalFrames zu verwenden ist eine nette Idee. Könnte sogar funktionieren. Aber wenn du dann z.B. plötzlich mehr Knöpfe benötigst, wirds vermutlich haarig.

Die meisten Componenten sind nicht allzu schwierig. Z.B. Ein JTabbedPane ist eine grosse Komponente um die Selektion darzustellen. Und eine Reihe von Tab-Componenten. Ein LayoutManager zu schreiben, der das halbwegs vernünftig handhabt (auch mit Problemen wie "zuwenig Platz") dauert vielleicht einen Nachmittag. Schöne Tabs zeichnen kann anspruchsvoll werden (je nach Übung und Talent).
 

mjdv

Bekanntes Mitglied
Okay cool danke.

dann versuche ich das mal. Aber was würdest du denn vorschlagen, eher auf Standard Komponente setzen, oder eigenes machen?

Dein Framework ist übrigens Top:toll: Respekt!


edit: Ich hab noch ne ganz andere Idee. Man könnte doch auch einfach nur JTabbedPanes nehmen, aber die Tabs auf die ganze Breite der Pane stretchen. So hat man für ein Dockable ein Tab in der Pane und es merkt niemand:D Das Problem mit den Buttons wäre somit auch behoben :D

Dann müsste man nur noch einen LayoutManager schreiben und die Drag'n'Drop Sachen oder?
 
Zuletzt bearbeitet:
B

Beni

Gast
In einem ersten Schritt Standard - um rauszufinden was du wirklich benötigst und was fehlt, sozusagen ein Prototyp. Wenn es nicht funktioniert, in einem zweiten Schritt was Eigenes schreiben. Mein Framework entstand ungefähr in dieser Reihenfolge, und es geht ganz gut so.

Das mit den Tabs kannst du doch mal versuchen, ich weiss nicht wie einfach oder schwierig das ist. Wäre doch eine nette Übung um mal die Finger locker zu kriegen ;-)

DnD habe ich bei mir mit ein paar einfachen MouseListeners gelöst. Man könnte die existierenden DnD Mechanismen von Swing verwenden, ist aber IMHO mehr als man benötigt. Und Dinge wie "Tab zwischen Tab reinschieben" muss man so oder so neu schreiben weil es schlicht und einfach noch nicht existiert.
 

mjdv

Bekanntes Mitglied
Okay, das austauschen von tabs in den Dockables/JTabbedPanes geht jetzt unter anderem wegen diesem tollen Blog Eintrag :D klick

Das Zeichnen eines Rechtecks auf der gesamten JTabbedPane geht nun auch.

So jetzt denke ich ist es an der Zeit einen Layout Manager zu implementieren, jedoch habe ich davon echt gar keine Ahnung :D

Also Beni, vll kannst du mir ja nochmal helfen und erzählen wie man an so etwas am besten rangeht. Habe davon nämlich nicht den blassesten Schimmer

Danke schon mal ;)
 
B

Beni

Gast
Also mein Kommentar zu dem LayoutManager bezog sich nur auf die Tabs - wenn man die Tabs selber macht.

Aber grundsätzlich hat ein LayoutManager eine Methode "layoutContainer" in der alle Kinder eines Container plaziert werden müssen (in deinem Fall werden die Kinder wohl die Dockables sein). Wie das genau geschieht, ist dem LayoutManager überlassen.
Falls du irgendwie Dockables nebeneinander platzieren willst, wie das Eclipse tut, wird dein LayoutManager irgendeine Art von Baum als Datenstruktur verwenden müssen. Die Dockables wären dann die Blätter dieses Baumes. Oder du setzt ein paar JSplitPanes ineinander, das könnte sogar einfacher sein.
 

mjdv

Bekanntes Mitglied
Okay, das heißt also, dass ich mehrere JSplitPanes schachteln sollte?

Und wie genau soll ich das machen, soll ich so ein Layout schreiben, wie es schon die Standardlayouts gibt, also das man dann frame.setLayout(mylayout) machen kann, oder soll ich eine Klasse den JFrame oder das JPanel übergeben und dann dort direkt auf dem Frame die Elemente anordnen?

Gibst da vll. so ne Art Tutorial, wie man einen Layout Manager schreibt?
 
B

Beni

Gast
Wenn Du JSplitPanes verwendest, hättest du halt schon diesen verschiebaren Zwischenraum. Und Componenten von einem JSplitPane zum anderen schieben sollte ja nicht allzu schwierig sein. Zusätzlich brauchst du hier keinen LayoutManager, da die SplitPanes schon alles ausrichten.

Wenn du lieber selbst was schreibst, würde ich eine Subklasse von JPanel machen und dort alle benötigten Einstellungen sauber zusammenfassen (wie gross der Zwischenraum ist, Methoden um Dockables einzufügen oder zu entfernen, etc.). Auf so einem JPanel würde ich dann schon sowas wie die Standardlayouts machen (also das Interface LayoutManager implementieren).

Es gibt zwar Tutorials für fast alles im Netz, aber wenn Du was Grösseres aufziehen willst, würde ich nicht Code zusammenkopieren - später verstehst Du sonst nicht was passiert und die Fehlersuche wird wirklich extrem mühsam.
 

mjdv

Bekanntes Mitglied
Okay, danke dir wirklich, für deine guten Hilfestellungen.

Ich denke ich werde demnächst das mit den JSplitPanes mal versuchen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
B Vertikale Größenänderung zwischen zwei Widgets AWT, Swing, JavaFX & SWT 2
T ThreadPool sicher beenden unter Verwendung von swt.widgets.Display.syncExec AWT, Swing, JavaFX & SWT 1
Tort-E JavaFX Mehere "Widgets" in einer Stage AWT, Swing, JavaFX & SWT 1
H org.eclipse.swt.widgets.Scale MouseRelease listener AWT, Swing, JavaFX & SWT 1
H org.eclipse.swt.widgets.Slider und negative Werte AWT, Swing, JavaFX & SWT 3
T eclipse.swt.widgets saveState NPE AWT, Swing, JavaFX & SWT 5
E SWT Popupmenu auf der Überschrift eines swt.widgets.Table verhindern? AWT, Swing, JavaFX & SWT 3
T Swing Gültigkeitsbereich (Sichtbarkeit) von Instanzvariablen (Swing-widgets) AWT, Swing, JavaFX & SWT 6
N SWT-Widgets in Farbe AWT, Swing, JavaFX & SWT 21
S SWT WizardPage - Button anzeigen und Text-Widgets dynamisch aktualisieren AWT, Swing, JavaFX & SWT 12
M SWT keine Scrollbar bei widgets.List und GridLayout AWT, Swing, JavaFX & SWT 2
T SWT Keine Anzeige der Widgets nach Comboauswahl AWT, Swing, JavaFX & SWT 2
N SWT Dialog mit swt-widgets AWT, Swing, JavaFX & SWT 5
S SWT: Widgets ersetzen AWT, Swing, JavaFX & SWT 6
M SWT pack() von org.eclipse.swt.widgets.Control AWT, Swing, JavaFX & SWT 8
R SWT Widgets in RCP Applikationen AWT, Swing, JavaFX & SWT 2
T GridLayout, zu wenig Platz zwischen Widgets AWT, Swing, JavaFX & SWT 3
S SWT-Widgets für Anzeige-Elemente AWT, Swing, JavaFX & SWT 3
L JavaFX SelectionService selber implementieren AWT, Swing, JavaFX & SWT 7
4 Swing Graphen selber zeichnen AWT, Swing, JavaFX & SWT 2
D Swing jSlider soll selber weiterwandern, je nach zeit der musik AWT, Swing, JavaFX & SWT 5
P [JTree] Markierhilfe der Drop-Location selber gestalten. AWT, Swing, JavaFX & SWT 4
T GUI-Builder selber erstellen AWT, Swing, JavaFX & SWT 2
G JIntegerField selber schreiben AWT, Swing, JavaFX & SWT 2
X MouseEvent selber auslösen AWT, Swing, JavaFX & SWT 12
I Event, Eventquelle und Listener selber schreiben AWT, Swing, JavaFX & SWT 9
G Mousecursor selber dynamisch generieren. AWT, Swing, JavaFX & SWT 6
G JScrollPane scrollt nach Neuzeichnen von selber AWT, Swing, JavaFX & SWT 2
V Listener selber schreiben? AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben