JavaFX Custom Component in JavaFX - Ideensammlung

White_Fox

Top Contributor
Moin allerseits

Mich treiben JavaFX und controlsfx etwas in den Wahnsinn und überlege deshalb, ob ich mich mal an einer eigenen JavaFX-Komponente versuchen sollte.

Ich will Daten in etwa so darstellen:
Screenshot 2025-06-13 193324.png

Jede Doppelzeile entspricht einem Datensatz. Die Spalte ganz links ist höchst individuell, da kann jeder Datensatz beliebig viele Einträge nach dem Schema Name-Objekt haben haben.

Momentan habe ich das mit einer SpreadsheetView aus controlsfx gelöst, wobei in der linken Spalte anstatt eines Strings wieder eine SpreadsheetView drinsteckt. Es gibt in der Demo zwar eine Version, wo controls explizig in einer SpreadsheetCell stehen, aber es sieht trotzdem mistig aus und das ist noch das beste, was ich nach vielen Versuchen hinbekommen habe. Richtig schlimm wird es, wenn man links etwas auswählt, dann verliert die "äußere" SpreadsheetView" ihren Fokus, die Auswahl (Spalte und Zeile der angeklickten Zelle werden normalerweise etwas hervorgehoben) verschwindet, und das SelectionModel liefert Müll.

Ich habe schon überlegt ob ich etwas bastle, daß die inneren SpreadsheetViews den Fokus wieder an die äußere SpreadsheetView zurückgeben oder das SelectionModel irgendwie aktualisiere, aber so richtig befriedigend ist das alles nicht. Und dann habe ich immer noch das Problem mit diesen häßlichen Scrollbalken in der linken Spalte.

Und nachdem ich kürzlich eine Component in Swing gebaut habe und damit sehr zufrieden war, überleg ich, ob ich sowas nicht auch für die JavaFX-GUI machen könnte. Daß JavaFX sich da wie ein Stachel im Arsch verhält ist mir schon klar, daher würde ich hier gerne eine Diskussion darüber starten, wie man sowas am sinnvollsten aufziehen kann. Immerhin haben die Jungs, die controlsfx geschrieben haben, damit ja auch irgendwie umgehen müssen.

Ich wäre auch durchaus bereit, so eine Tabelle flexibel genug zu halten, daß die auch von anderen weitergenutzt werden kann und nicht nur auf dieses Projekt beschränkt bleiben muß...vielleicht hat ja jemand Interesse daran? Tabellen sind in allen mir bekannten GUI-Bibliotheken für Java ein eigenes Problem für sich...

Also, irgendwelche Vorschläge?
 

Ernesto95

Bekanntes Mitglied
Moin !

Gerrit Grunwald hat zum Thema Custom Components in JavaFX vor 4 Jahren mal einen sehr ausführlichen 7-teiligen Blog veröffentlicht. Und wenn man sich so anschaut was er in den Jahren alles für Komponenten erstellt hat würde ich sagen er hat Ahnung davon ;-)



Denke das ist ein sehr guter Einstiegspunkt um mal die Möglichkeiten und verschiedenen Herangehensweisen zu sehen die JavaFX bietet.

Greetz
 

White_Fox

Top Contributor
Ich habe jetzt die ersten zwei Artikel gelesen und mir auch den Vortrag zu Gemüte geführt.
Es ist schon beeindruckend was der Kerl mit JavaFX macht.

Was er auch sagt: Wenn man versucht mit JavaFX wie in Swing zu arbeiten, wird es nicht funktionieren. Ich hege zwar keinesfalls mehr Symphatie für manche Konzepte und Umsetzungen (TableView!), aber ich denke ich werde meine recht schlechte Meinung über JavaFX doch an einigen Punkten überdenken.
 

Ernesto95

Bekanntes Mitglied
Freut mich das ich helfen konnte.

Ich denke wenn man ein gewachsenes Projekt hat das auf Swing basiert macht es keinen Sinn dieses mit dem Brecheisen auf JavafX portieren zu wollen. Swing ist eine gestandene und in Würde gealterte Bibliothek.

Aber wenn man jetzt ein neues Desktop Projekt beginnt dann gibt es meiner Meinung nach keinen Grund das alte Swing dem neuen JavaFX vorzuziehen.

  • Im Gegensatz zu Swing wird es aktiv weiterentwickelt und erhält neben Bugfixes auch noch neue Features.
  • Es sieht schon im Default Theme deutlich moderner aus.
  • Unterschiedliche Themes sind dank CSS extrem leicht umzusetzen. Da das Standardtheme von JavaFX z.B. nur wenige Farben definiert und der Rest von diesen abgeleitet wird reicht häufig schon das überschreiben der fx-base Variable im CSS aus, um ein komplett neues Farbthema zu erhalten.
  • Dank SceneBuilder sind Layouts innerhalb weniger Minuten als FXML erstellt. Mit dem SwingBuilder in Netbeans kam ich persönlich hingegen nie zurecht.
  • Konzepte wie das Binding helfen bei der Trennung der einzelnen Komponenten.
  • Out Of The Box Unterstützung für Audio, Video, WebView, 3D, die in Swing nur über Drittanbieter möglich ist.
  • Wenn sich irgendwas bewegen soll ist das mit Transitions in Sekunden umgesetzt.

Grüße
 

White_Fox

Top Contributor
Konzepte wie das Binding helfen bei der Trennung der einzelnen Komponenten.
Hehe, der Gerrit Grunwald hingegen hasst Bindings. (Was mir in JavaFX bisher tatächlich auch eher negativ aufgefallen ist).

Edit:
In meinem Fall geht es tatsächlich um ein Projekt, daß bereits in JavaFX läuft. Ich bin mit der Tabellendarstellung, die ich bisher habe, allerdings nicht glücklich.
 
Zuletzt bearbeitet:

KonradN

Super-Moderator
Mitarbeiter
Ich frage mich etwas, woher diese Einschätzung bezüglich Bindings kommt. Liegt es evtl. daran, dass ein Modellierung gewählt wurde, die eher weniger auf Bindings setzt und in der dies nicht wirklich sinnvoll eingesetzt werden kann?

Ich selbst fand Bindings immer extrem sinnvoll (in der Anwendungsentwicklung) und habe da auch eine klare Sichtweise. Aber ich muss auch klar sagen, dass ich halt auch sehr viel mit MVVM gemacht habe und dies u.a. auch beruflich einsetzen musste (War viele Jahre in einem .Net Team und wir hatten auch WPF und Silverlight im Einsatz.) Ich empfand es als extrem wichtig:
  • die UI deklarativ zu gestalten - relativ unabhängig vom eigentlichen Code.
  • Bindings zu nutzen - es gab halt einfach klar definierte Schnittstellen und über die konnte dann die UI anknüpfen

Das hatte relativ große Vorteile. So liessen sich z.B. die Ansatzpunkte der UI sehr gut Unit Testen. (So konnten wir bei den UI Tests deutlich vereinfacht vorgehen. Da ging es wirklich nur noch um Aussehen und ob die Verknüpfungen richtig waren...)

Und wenn ich dann gewisse Probleme höre / lese, dann frage ich mich wirklich, ob da nicht schon bereits ein Kernproblem der Aufbau ist. Aber das ist dann auch in keiner Weise als Vorwurf zu verstehen: JavaFX ist bezüglich dieser Dinge einfach tot. Das mvvmfx Projekt ist tot, vernünftige Controls fehlen, ... Da hat man einfach kein gutes Grundgerüst, auf dem man gut aufsetzen kann. Und wenn man da gute Dokumentation sucht, dann landet man bei Microsoft (die MVVM gut beschrieben haben) ...

Und dann gibt es halt nur archaisch anmutende Frameworks (Ja, Swing, Windows Forms, ... das ist alles noch auf dem Level der C++ UI Entwicklung von damals ...) und weil die halt vieles nicht bieten, wird sogar noch nach Ersatz gesucht, wo aber doch der Mehrwert fehlt (Was bringt es, da ein C++ Framework einzubinden, das auch nichts konzeptionell Neues bietet?)

Und andere Frameworks gehen natürlich auch neue Wege ... Wer C++ anschaut, wird bei QT z.B. sehen, wie da so Dinge gelöst wurden und so.

Das ist aber auch einfach nur meine Sichtweise auf das Dilemma. Ich habe leider keinerlei Lösung zu Hand. Wenn ich ein kommerzielles Projekt hätte mit gewissen Ansprüchen an die UI (bezüglich Komplexität und so), dann würde ich auf jeden Fall versuchen, ein eigenes Framework zu bauen, das auf die Anforderungen angepasst ist. Ohne sowas sehe ich fast schwarz. Man wird einfach zu viel Code haben, der dann womöglich immer weiter kopiert wird, weil es eben keine Abstraktion gab. Das sehe ich zumindest generell bei den Projekten, die wir so gemacht haben (waren dann Projekte von Dualis, die haben dann kleine Tools geschrieben.... Egal ob Swing oder JavaFX: Es wurden dann Dinge aus dem Web adaptiert, sprich: Man kopiert Code und passt ihn dann an seine Verhältnisse an.) Da war extrem viel Code um z.B. Tabellen zu haben mit irgendwelchen Features, so dass es eben nicht nur 08/15 Anzeige einer Tabelle war.

Bezüglich Ideen hatte ich ja bereits ein paar Vorstellungen in einem eigenen Thread. Da muss ich dann nur die Zeit finden, um da mal weiter etwas auszuarbeiten. Denn so ein Komponenten-Ansatz sieht aus meiner Sicht gut aus und ich meine immer noch, dass dies mit JavaFX, MVVM und Bindings gut gehen müsste ... Und das ohne zu viel eigenen Code schreiben zu müssen....
 

White_Fox

Top Contributor
Ich frage mich etwas, woher diese Einschätzung bezüglich Bindings kommt. Liegt es evtl. daran, dass ein Modellierung gewählt wurde, die eher weniger auf Bindings setzt und in der dies nicht wirklich sinnvoll eingesetzt werden kann?
Das lag bei meinem Projekt an mehreren Dingen. Einerseits: Ja, ich hatte auch keine Lust mich mit den Bindings allzu sehr auseinanderzusetzen.

Andererseits war ich aber auch sehr mißtrauisch, ob ich mir mit vorgefertigten Bindings nicht auch ins Knie schießen und das evt. erst zu spät bemerken würde. Ich habe z.b. im Controller noch eine Instanz, die unter bestimmten Bedingungen Eingaben auf Zulässigkeit prüft. Konkret: Um die Bedienung des Programms zu erlernen, habe ich dort ein Tutorial eingebaut daß dem Benutzer auch Aufgaben stellt. Und die Kontrollinstanz stellt sicher, daß der Benutzer keinen Blödsinn eingeben kann und das Tutorial blockiert.

Wo ich mir das Binding-Konzept wirklich mal angesehen habe, war die TableView. Das Ding, dem man eine Liste Datenobjekte reinwirft und daß dann die Spaltennamen aus den Methodennamen im Code extrahiert. Ich hab das ja schon oft genug angemeckert. Das war ziemlich das erste, was ich in JavaFX ausprobiert habe, danach wollte ich mit JavaFX-Bindings auch nichts mehr zu tun haben.

Vielleicht hatte es auch damit zu tun daß ich mich vor diesem Projekt mit Entwurfsmustern, darunter MVC, auseinandergesetzt habe und die MVC-Struktur sinnvoll fand und umsetzen wollte. Von Alternativen zu MVC habe ich damals noch nichts gehört. MVC zu verstehen und in Code zu gießen war schon anstrengend genug (ich habe zwischen meinen verschiedenen Versuchen so einige tausend Codezeilen geschrieben und wieder verworfen). Ich habe dann etwas gehabt das gut funktioniert hat, und habe in anderen Strukturen auch keinen Vorteil gesehen. Jedenfalls keinen der mir wichtig genug gewesen wäre.

Der wichtigste Grund ist aber wahrscheinlich, daß ich einfach kein Programmierer oder Softwareentwickler bin. Ich programmiere zwar gerne (und ich glaube ich darf sagen, mittlerweile programmiere ich auch nicht allzu schlecht), aber meine Profession ist nunmal der Hardwarebau. Nichtsdestotrotz habe ich dennoch hohe Ansprüche an meine Programmierergebnisse, und will die natürlich auch durchsetzen. Da es hier nicht um Geld geht, kann ich es mir zum Glück auch leisten den steinigen Weg zu dem zu gehen, was ich für das bessere Ergebnis halte. Und dann komme ich halt auch mal dazu, irgendwelche View-Elemente selber zu bauen. Grenzen hat das natürlich trotzdem irgendwann, schließlich soll jCLS ja irgendwann mal fertig werden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Splayfer Custom Font in AttributedString Java AWT, Swing, JavaFX & SWT 4
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
S JavaFX Java Custom Node Grafik zurückgeben AWT, Swing, JavaFX & SWT 2
F JavaFX Custom Exceptions AWT, Swing, JavaFX & SWT 5
Yjuq JavaFX Custom Control - Image resize AWT, Swing, JavaFX & SWT 0
D Gluon Scene Builder Custom AWT, Swing, JavaFX & SWT 0
B JavaFX Custom TextInputControl AWT, Swing, JavaFX & SWT 1
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
F JavaFX Custom ListView erstellt ghost Element AWT, Swing, JavaFX & SWT 3
X Custom Controls AWT, Swing, JavaFX & SWT 5
T JavaFX Custom Layout AWT, Swing, JavaFX & SWT 5
L JavaFX Custom control mit Hover Effekt AWT, Swing, JavaFX & SWT 2
M Swing JColorchooser anpassen - custom style? AWT, Swing, JavaFX & SWT 0
M JavaFX Parameter für Custom Control in FXML übergeben? AWT, Swing, JavaFX & SWT 4
B Custom JTabbedPane-Tab-Design AWT, Swing, JavaFX & SWT 2
N JLabel HTML mit custom Font AWT, Swing, JavaFX & SWT 0
P Verbuggte custom JButton unter Windows AWT, Swing, JavaFX & SWT 9
G TitledPane Custom Title AWT, Swing, JavaFX & SWT 6
N Custom JButton Feld aus Parent lesen lassen AWT, Swing, JavaFX & SWT 11
V Swing Custom JToggleButton in JTable - Click-Event geht erst beim zweiten Mal AWT, Swing, JavaFX & SWT 7
lumo SWT JFace Databinding +Custom Table AWT, Swing, JavaFX & SWT 2
B Swing JTable custom ColumnModel Problem AWT, Swing, JavaFX & SWT 5
W Swing Tag Oder Custom Eintrag AWT, Swing, JavaFX & SWT 7
algorismi Custom JDesktopIcon AWT, Swing, JavaFX & SWT 5
hdi Custom Cursor: Problem mit Größe AWT, Swing, JavaFX & SWT 5
N JComboBox mit Custom Object AWT, Swing, JavaFX & SWT 2
V Frage zu JScrollPane mit Custom Headern, mit Beispiel AWT, Swing, JavaFX & SWT 2
S [S] custom tree componente AWT, Swing, JavaFX & SWT 8
Z MessageDialog mit Custom panel erstellen AWT, Swing, JavaFX & SWT 2
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
C Swing Component bei Doppelklick löschen AWT, Swing, JavaFX & SWT 4
R Swing Hat mein JFrame meinen Component? AWT, Swing, JavaFX & SWT 2
R Layout Manager null und Component wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 3
B Größe der Parent-Component dynamisch an children anpassen AWT, Swing, JavaFX & SWT 30
K JavaFX Component Größe an Inhalt anpassen AWT, Swing, JavaFX & SWT 11
M Swing Component Resize AWT, Swing, JavaFX & SWT 7
L Eigene Component anordnen AWT, Swing, JavaFX & SWT 7
L Eigene Component Layout AWT, Swing, JavaFX & SWT 4
W Swing Component mehrfach adden AWT, Swing, JavaFX & SWT 0
H Drag component out of window AWT, Swing, JavaFX & SWT 1
A remove(Component) funktioniert nicht; JTable AWT, Swing, JavaFX & SWT 4
A Swing Focus auf gemalte Component AWT, Swing, JavaFX & SWT 5
L Swing Component alignment innerhalb einer JList AWT, Swing, JavaFX & SWT 3
M AWT Drag n Drop-Support für Component AWT, Swing, JavaFX & SWT 5
M Kein resize nach Component.setVisible() AWT, Swing, JavaFX & SWT 2
Ebenius AWT Bug in Component.getLocationOnScreen() AWT, Swing, JavaFX & SWT 7
C AWT Fokus von Component entfernen, wenn kein anderes vorhanden AWT, Swing, JavaFX & SWT 4
B JTable Component mit String? AWT, Swing, JavaFX & SWT 4
M Eigenes Panel aus Component? AWT, Swing, JavaFX & SWT 5
H Component Zerren AWT, Swing, JavaFX & SWT 5
S Swing Component vertikal und hochizontal zentrieren? AWT, Swing, JavaFX & SWT 5
Z Component für File-Browser ähnliche Oberfläche AWT, Swing, JavaFX & SWT 6
B Swing verschachteltes GUI: repaint() ändert mehr als nur gewünschte Component AWT, Swing, JavaFX & SWT 4
V Swing remove(Component) blockiert Thread sehr lange. AWT, Swing, JavaFX & SWT 6
C Problem mit remove(Component comp) AWT, Swing, JavaFX & SWT 23
F AWT Component in OpenGL anzeigen? AWT, Swing, JavaFX & SWT 18
A Java Konsolen Component AWT, Swing, JavaFX & SWT 6
G Swing Component.toString() was bedeutet flags AWT, Swing, JavaFX & SWT 8
1 Eigene Component in JScrollBar + fixe Linien??? AWT, Swing, JavaFX & SWT 2
DamienX Swing Component auf mehreren Containern AWT, Swing, JavaFX & SWT 2
algorismi AWT Tranparente heavyweight component AWT, Swing, JavaFX & SWT 2
R Swing Methode add([Component]) funzt nich AWT, Swing, JavaFX & SWT 7
Developer_X AWT Component added keinen MouseListener AWT, Swing, JavaFX & SWT 7
U LayoutManager [GBL] Component aus einer Zelle löschen AWT, Swing, JavaFX & SWT 2
H Swing Illegal component position! AWT, Swing, JavaFX & SWT 2
C Flamingo Component AWT, Swing, JavaFX & SWT 2
M Doppelklick auf Component abfangen AWT, Swing, JavaFX & SWT 5
P DragAndDrop zw Component und Container AWT, Swing, JavaFX & SWT 4
M AWT Component/Canvas erzeugt unerwünschten Rahmen bei paint AWT, Swing, JavaFX & SWT 3
T Swing Component in Graphics zeichnen AWT, Swing, JavaFX & SWT 4
R Zugriff auf Component um addComponentListener() aufzurufen AWT, Swing, JavaFX & SWT 4
K AWT/SWING intern - Wie funktioniert die Component-Ermittlung AWT, Swing, JavaFX & SWT 13
S Line Component in SWING AWT, Swing, JavaFX & SWT 2
S java.awt.Component und paint() AWT, Swing, JavaFX & SWT 4
hdi Verständnisfrage: Container vs. Component AWT, Swing, JavaFX & SWT 3
D Eigene Component erstellen? AWT, Swing, JavaFX & SWT 4
C Syntax Highlighting Component AWT, Swing, JavaFX & SWT 2
O KeyBoardFocusManager - previous und next Component checken? AWT, Swing, JavaFX & SWT 2
A Eigene, sich selbst zeichnende Component AWT, Swing, JavaFX & SWT 5
A erneutes Öffnen jInternalFrame: illegal component position AWT, Swing, JavaFX & SWT 4
0 Component austauschen und aktualisieren ? AWT, Swing, JavaFX & SWT 6
S Thread beenden, wenn Component nicht mehr benötigt wird AWT, Swing, JavaFX & SWT 12
G "Rating Component" - Bewerten über JTable AWT, Swing, JavaFX & SWT 3
G Drag And Drop von Component (List, Tree) zum Desktop AWT, Swing, JavaFX & SWT 2
F LayoutManager und Component.setVisible(boolean) AWT, Swing, JavaFX & SWT 2
P Component ändern (repaint) AWT, Swing, JavaFX & SWT 9
F Probleme bei add(Component) JPanel > JFrame AWT, Swing, JavaFX & SWT 3
B Component AWT, Swing, JavaFX & SWT 5
L Swing Component in Buffered Image AWT, Swing, JavaFX & SWT 6
G Component "finden" AWT, Swing, JavaFX & SWT 6
H Component fokussierbar machen AWT, Swing, JavaFX & SWT 2
P Wie das Component Object des Hauptfensters ermitteln? AWT, Swing, JavaFX & SWT 4
M GridBagLayout - Component Position AWT, Swing, JavaFX & SWT 4
R Component einer Form herausbekommen AWT, Swing, JavaFX & SWT 3
T JMenu/JMenuItem Component auf der geaddet wurde AWT, Swing, JavaFX & SWT 16
B Component in JSplitPane aktualisieren AWT, Swing, JavaFX & SWT 2
G add(Component) in paintComponent erlaubt ? AWT, Swing, JavaFX & SWT 2
K Component einfügen in JPane AWT, Swing, JavaFX & SWT 5
M getSize von Component und ModelListener AWT, Swing, JavaFX & SWT 2
S Component auf Label zeichnen? AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben