JavaFX kann man da noch was am code vereinfachen design technisch sieht nicht richtig aus...

M

Mart

Gast
ich versuche für mein Rapidfx die erstellung von nodes und views vereinfachen

Java:
    BorderPane root = GUIFactory.getBorderPane()
        .bottom(new Button("Bottom"))
        .top(new Button("Top"))
        .centerView(this.view)
        .id("bob")
        .build();
das sieht ja schon gut aus ( ? ) es sollte das "zusammenbauen" der Views vereinfachen so sachen wie widthproperty und css sollten fürs erste extra gemacht werden

für das hab ich die klasse die stark danach aussieht dass ich da was vereinfachen könnte da es ansich 12 mal das selbe ist aber ich steh auf dem schlauch in der Hinsicht...
Java:
public class BorderPaneBuilder extends AnyFactory<BorderPane, BorderPaneBuilder> {

  public BorderPaneBuilder() {
    root = new BorderPane();
  }

  public BorderPaneBuilder top(Node node) {
    root.setTop(node);
    return this;
  }

  public BorderPaneBuilder left(Node node) {
    root.setLeft(node);
    return this;
  }

  public BorderPaneBuilder right(Node node) {
    root.setRight(node);
    return this;
  }

  public BorderPaneBuilder center(Node node) {
    root.setCenter(node);
    return this;
  }

  public BorderPaneBuilder bottom(Node node) {

    root.setBottom(node);
    return this;
  }
  public BorderPaneBuilder bottomView(RapidView<?> view) {
    bottom(view.getRootPane());
    return this;
  }
  public BorderPaneBuilder topView(RapidView<?> view) {
    top(view.getRootPane());
    return this;
  }
  public BorderPaneBuilder leftView(RapidView<?> view) {
    left(view.getRootPane());
    return this;
  }
  public BorderPaneBuilder rightView(RapidView<?> view) {
    right(view.getRootPane());
    return this;
  }
  public BorderPaneBuilder centerView(RapidView<?> view) {
    top(view.getRootPane());
    return this;
  }
  public BorderPane build() {
    return root;
  }

}
in der Any factory steht die id() methode und dass root dann dem generischen typen entspricht kann ich ja nachreichen
 

Robert Zenz

Top Contributor
Nein, das wird nicht besser. Du hast nur eine Zeile Code pro Aufruf, und davon auch keine Komplexitaet in der Zeile, egal was du da versuchst, unter eine Zeile wirst du nicht kommen. Du koenntest anfangen mit Lambdas und aehnlichem, aber du kommst nicht unter eine Zeile.

Was mir aber auffaellt, waere das du eventuell den Builder komplett vernichten kannst. Du koenntest dich direkt von BorderPane ableiten und die Methoden ueberschreiben:

Java:
public RapidBorderPane extends BorderPane {
    public RapidBorderPane() {
        super();
    }
   
    @Override
    public RapidBorderPane setRight(Node node) {
        super.setRight(node);
       
        return this;
    }
}

Java:
BorderPane pane = new RapidBorderPane()
        .setBottom(new Button("Bottom"))
        .setTop(new Button("Top"))
        .setCenterView(this.view)
        .setId("bob")

Also quasi einfach nur eine Verbesserung der bisherigen API.
 
M

Mart

Gast
die set Methoden sind final :D
genauso wie deren properties

im moment schauts so aus
Java:
public class BorderPaneBuilder extends AnyFactory<BorderPane, BorderPaneBuilder> {
  private enum Position {
    TOP, LEFT, RIGHT, CENTER,BOTTOM;
  }

  private BorderPaneBuilder set(Position position, Node node) {
    switch (position) {
    case CENTER -> root.setCenter(node);
    case LEFT -> root.setLeft(node);
    case RIGHT -> root.setRight(node);
    case TOP -> root.setTop(node);
    case BOTTOM -> root.setBottom(node);
    }
    return this;
  }

  public BorderPaneBuilder() {
    root = new BorderPane();
  }

  public BorderPaneBuilder top(Node node) {
    return set(Position.TOP, node);
  }

  public BorderPaneBuilder left(Node node) {
    return set(Position.CENTER, node);
  }

  public BorderPaneBuilder right(Node node) {
    return set(Position.RIGHT, node);
  }

  public BorderPaneBuilder center(Node node) {
    return set(Position.CENTER, node);
  }

  public BorderPaneBuilder bottom(Node node) {
    return set(Position.BOTTOM, node);
  }

  public BorderPaneBuilder bottom(RapidView<?> view) {
    return bottom(view.getRootPane());
  }

  public BorderPaneBuilder top(RapidView<?> view) {
    return top(view.getRootPane());
  }

  public BorderPaneBuilder left(RapidView<?> view) {
    return left(view.getRootPane());
  }

  public BorderPaneBuilder right(RapidView<?> view) {
    return right(view.getRootPane());
  }

  public BorderPaneBuilder center(RapidView<?> view) {
    return top(view.getRootPane());
  }

}
 

Robert Zenz

Top Contributor
Java:
public class BorderPaneBuilder extends AnyFactory<BorderPane, BorderPaneBuilder> {
private enum Position {
TOP, LEFT, RIGHT, CENTER,BOTTOM;
}

private BorderPaneBuilder set(Position position, Node node) {
switch (position) {
case CENTER -> root.setCenter(node);
case LEFT -> root.setLeft(node);
case RIGHT -> root.setRight(node);
case TOP -> root.setTop(node);
case BOTTOM -> root.setBottom(node);
}
return this;
}

public BorderPaneBuilder() {
root = new BorderPane();
}

public BorderPaneBuilder top(Node node) {
return set(Position.TOP, node);
}

public BorderPaneBuilder left(Node node) {
return set(Position.CENTER, node);
}

public BorderPaneBuilder right(Node node) {
return set(Position.RIGHT, node);
}

public BorderPaneBuilder center(Node node) {
return set(Position.CENTER, node);
}

public BorderPaneBuilder bottom(Node node) {
return set(Position.BOTTOM, node);
}

public BorderPaneBuilder bottom(RapidView<?> view) {
return bottom(view.getRootPane());
}

public BorderPaneBuilder top(RapidView<?> view) {
return top(view.getRootPane());
}

public BorderPaneBuilder left(RapidView<?> view) {
return left(view.getRootPane());
}

public BorderPaneBuilder right(RapidView<?> view) {
return right(view.getRootPane());
}

public BorderPaneBuilder center(RapidView<?> view) {
return top(view.getRootPane());
}

}
Aber das macht's doch nicht besser mit dem Enum...? Gewinnst du ja nichts (auszer dass du jetzt einen Enum mitschleifst).
 

Robert Zenz

Top Contributor
Achso, du koenntest die Methoden noch anders beim ableiten benennen:

Java:
BorderPane pane = new RapidBorderPane()
        .withBottom(new Button("Bottom"))
        .withTop(new Button("Top"))
        .withCenter(this.view)
        .withId("bob")
 
M

Mart

Gast
von der Grundsätzlichen Idee warum sollte man den Builder eher vermeiden?

es würde ja wie gezeigt auf beide möglichkeiten gehen

dachte delegation over inheritance?
 

Robert Zenz

Top Contributor
von der Grundsätzlichen Idee warum sollte man den Builder eher vermeiden?
Sollte nicht, nur persoenliche Praeferenz. Von der Verwendung her ergeben sich Unterschiede wie du ja schon gesehen hast. Hinzu kommt noch dass beim Builder dann "Erstellung" und "Veraenderung" unterschiedlich sind.

Java:
BorderPane pane = GUIFactory.getBorderPane()
        .bottom(new Button("Bottom"))
        .top(new Button("Top"))
        .centerView(this.view)
        .id("bob")
        .build();

// Some time later in a button event.

pane.setTop(anotherButton);
pane.setBottom(someNewLabel);

Java:
RapidBorderPane pane = new RapidBorderPane()
        .withBottom(new Button("Bottom"))
        .withTop(new Button("Top"))
        .withCenter(this.view)
        .withId("bob");

// Some time later in a button event.

pane.withTop(anotherButton)
        .withBottom(someNewLabel);

Builder werden fuer gewoehnlich auch nur dann eingesetzt wenn das erstellte Objekt entweder nicht mehr veraendert werden kann, oder wenn es komplex ist und der Builder Einfachheit bringt. Was beides bei den JavaFX Controls nicht unmittelbar der Fall ist. Was ja da nur halt reinhakt ist dass die JavaFX Entwickler final verwenden als waere es Schokostreusel.

dachte delegation over inheritance?
Ich entgegne "Whatever gets the job done". Solchen "Saetzen der Weisheit" sollte man nicht blind folgen, wie ich ja letztens schon bei den Strings und der Datenbank erklaert habe.

Zugegeben, mein Hauptaugenmerkt bei so etwas liegt aber auch nicht auf der Implementierung selbst, sondern auf dem Code welche dann daraus resultiert. Es nuetzt nichts wenn du das beste und tollste Framework hast, wenn sich der Code in deiner Applikation dann liest wie ein Waschbetonboden und du alle naselang irgendwelche Sonderfaelle beachten musst.
 
M

Mart

Gast
ich habe es jetzt auch so übernommen wie du geschrieben hattest
Java:
public class RapidBorderPane extends BorderPane {

  public RapidBorderPane top(Node node) {
    this.setTop(node);
    return this;
  }

  public RapidBorderPane left(Node node) {
    this.setLeft(node);
    return this;
  }

  public RapidBorderPane right(Node node) {
    this.setRight(node);
    return this;
  }

  public RapidBorderPane center(Node node) {
    this.setCenter(node);
    return this;
  }

  public RapidBorderPane bottom(Node node) {
    this.setBottom(node);
    return this;
  }

  public RapidBorderPane bottom(RapidView<?> view) {
    return bottom(view.getRootPane());
  }

  public RapidBorderPane top(RapidView<?> view) {
    return top(view.getRootPane());
  }

  public RapidBorderPane left(RapidView<?> view) {
    return left(view.getRootPane());
  }

  public RapidBorderPane right(RapidView<?> view) {
    return right(view.getRootPane());
  }

  public RapidBorderPane center(RapidView<?> view) {
    return top(view.getRootPane());
  }

}

wahrscheinlich wirds auch nich mehr besser .. die borderpane ist wahrscheinlich vererbungs technisch eh ne katastrophe... die getChildren() methode bringt einfach mal gar nix mehr und ist total useless und jetzt auch noch das mit den finals

aber das mit der Vererbung wurde wahrschienlich in javafx übertrieben.. man kann eine SimpleReadOnlyDoubleWrapperProperty machen

und dass ich ganze 2 insane konstruktoren habe
etnweder gar nix, oder alle 5 optionen... da hätte sich wahrscheinlich der Builder angeboten ihn einzubauen weil man kann ja builder für optionale parameter benutzen aber man musste es void machen und final oben drauf


es funktioniert wengistens so dass ich incht mehr
Java:
borderpane.setTop(...)
borderpane.setLeft(...)
borderpane.setCenter(...)
schreiben muss , mein framework sollte es ja nicht neu erfinden sondern alles einfacher machen dass man halt schneller zum ziel kommt... ja der name war nicht gerade kreativ xD
 
Zuletzt bearbeitet von einem Moderator:
M

Mart

Gast
selbst wenn ich es überschreiben könnte ich kann ja nicht den return Typ in der Super klasse überschreiben
 
M

Mart

Gast
Java:
  @Override
  protected BorderPane layoutChildren() {
    // TODO Auto-generated method stub
    super.layoutChildren();
    return this;
  }
wenn ich dasd überschreiben will ( normal ist es void ) kommt der Fehler
The return type is incompatible with BorderPane.layoutChildren()
stell ich mich grad an wie der erste mensch? wie kann ich denn beim überschreiben dne Return typ ändern?
 

Robert Zenz

Top Contributor
Nein, das war mein Fehler, das geht nicht. Ich haette schwoeren koennen dass das ging, aber es geht nicht, oder zumindest geht es nicht durch den Compiler durch (Laufzeit ist ja wieder was anderes).

Ich haette schwoeren koennen dass man das haette machen koennen, keine Ahnung wo ich da gerade falsch abgebogen bin...dann bleibt nur noch neue Methoden...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M JavaFX Mandelbrot-bild noch nicht optimiert AWT, Swing, JavaFX & SWT 7
K Wie kann ich noch den scale bekommen, außer mit getScaleX oder getScaleY? AWT, Swing, JavaFX & SWT 1
P Swing GUI noch nicht gezeichnet - Logik läuft - blockiert AWT, Swing, JavaFX & SWT 3
P Swing Nach removeAll() noch 1 Element vorhanden AWT, Swing, JavaFX & SWT 0
G noch eine Frage zum EventDispachThread AWT, Swing, JavaFX & SWT 4
D SWT TreeViewer: Daten aus Model gelöscht... trotzdem noch im Baum AWT, Swing, JavaFX & SWT 4
B Swing Noch ein Zeichenprogramm... AWT, Swing, JavaFX & SWT 19
R Noch einmal x^2 bzw. parabel AWT, Swing, JavaFX & SWT 2
V Swing Neue Größe bei ComponentListener noch nicht verfügbar? AWT, Swing, JavaFX & SWT 3
S 3D-Grafik Java3D und was noch? AWT, Swing, JavaFX & SWT 3
T Event Dispatch Thread und noch ein Thread AWT, Swing, JavaFX & SWT 7
Nicer LookAndFeel Suche noch LaFs AWT, Swing, JavaFX & SWT 7
2 Werde Java GUIs immer noch mit dem in die Jahre gekommen Swing gemacht? AWT, Swing, JavaFX & SWT 12
M SWT Mutter-Shell blocken während Tochter-Shell noch offen ist AWT, Swing, JavaFX & SWT 6
R noch ein DoubleBuffering Noob AWT, Swing, JavaFX & SWT 10
S Swing noch nicht übergebenen Wert aus JComboBox auslesen AWT, Swing, JavaFX & SWT 4
S Swing Fenster schliessen, javaw noch im Speicher AWT, Swing, JavaFX & SWT 5
U JList mit Hintergrundbild hinterlegen und noch ne Frage AWT, Swing, JavaFX & SWT 4
S Weder ActionListener noch Graphics wollen so recht AWT, Swing, JavaFX & SWT 3
G JTree mouseClicked -> kontrolle ob noch ein unterknoten e AWT, Swing, JavaFX & SWT 2
A Noch mal Zusammenarbeit Java und HTML AWT, Swing, JavaFX & SWT 4
A Noch mals Probleme mit Login AWT, Swing, JavaFX & SWT 3
G Text eines noch aktiv editierten Textfeldes lesen AWT, Swing, JavaFX & SWT 2
H Noch einmal JList (nichts auswählen) AWT, Swing, JavaFX & SWT 2
C AWT, Swing & was sonst noch. AWT, Swing, JavaFX & SWT 11
E Toturial weg! Hat noch wer ne Kopie! AWT, Swing, JavaFX & SWT 3
U sporadisches Deadlock und noch ein Schmankerl ;) AWT, Swing, JavaFX & SWT 9
M Es bleibt immer noch eine Javaw instanz zurück AWT, Swing, JavaFX & SWT 3
H Swing nach schließen noch sichtbar AWT, Swing, JavaFX & SWT 4
comp_math Code snippets AWT, Swing, JavaFX & SWT 3
G JavaFX Code in neues Projekt übernehmen AWT, Swing, JavaFX & SWT 0
princess_sara1997 .jar Datei führt den Code nicht richtig aus AWT, Swing, JavaFX & SWT 19
S Ich bringe Code mit JavaFX unter Apache NetBeans IDE 12.6 nicht zum laufen. AWT, Swing, JavaFX & SWT 14
U Kann man den Code umschreiben? AWT, Swing, JavaFX & SWT 8
U Code doch nicht austauschbar in 2DGraphics AWT, Swing, JavaFX & SWT 2
K Bekomme (u.a) javafx.fxml.LoadException trotz "korrektem" Code AWT, Swing, JavaFX & SWT 8
S ActionEvent Press Enter per Code auslösen AWT, Swing, JavaFX & SWT 22
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
CptK Ordentlicher Code & Panel ab bestimmter Komponentenzahl scrollbar machen AWT, Swing, JavaFX & SWT 12
T Anderen Java Code durch Code kompilieren und Fehler in Label ausgeben AWT, Swing, JavaFX & SWT 5
L Verbindung von Code und JFrame AWT, Swing, JavaFX & SWT 4
M Swing Code funktioniert auf Windows aber nicht Linux... AWT, Swing, JavaFX & SWT 3
T JavaFX Falscher Wert getLayoutBounds? + Tipps zum Code-Aufbau? AWT, Swing, JavaFX & SWT 8
S JavaFX JavaScript Code in WebView/WebEngine AWT, Swing, JavaFX & SWT 0
L JavaFX GUI mit JavaFX. Scene Builder source code? AWT, Swing, JavaFX & SWT 6
V JavaFX Button Controller Fehler, trotz Erfolg in einem anderem Code? AWT, Swing, JavaFX & SWT 7
Ernesto95 JavaFX FXML vs. Java Code AWT, Swing, JavaFX & SWT 3
T Hilfe bei Code AWT, Swing, JavaFX & SWT 2
B Wie erstelle ich eine JavaFX Anwendung von diesem Code? AWT, Swing, JavaFX & SWT 3
D JavaFX Beim Schließen (Rotes X) Code ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX Dynamisch erzeugte Buttons sollen Code ausführen. AWT, Swing, JavaFX & SWT 2
T Tab per Code wechseln? AWT, Swing, JavaFX & SWT 3
C Swing GUI extrem langsam - GUI-Code richtig ausführen AWT, Swing, JavaFX & SWT 1
U Bild innerhalb hatml code anzeigen AWT, Swing, JavaFX & SWT 5
N JOGL-Code != C OpenGL-Code? AWT, Swing, JavaFX & SWT 9
R Source-Code, Javadoc AWT, Swing, JavaFX & SWT 16
S NetBeans GUI Builder - Code-Platzierung AWT, Swing, JavaFX & SWT 3
J Sauberer Gui-Code? AWT, Swing, JavaFX & SWT 22
B Color String Code AWT, Swing, JavaFX & SWT 3
D JFreeChart - aktuelle code beispiele AWT, Swing, JavaFX & SWT 11
T Bei Klick Code ausführen AWT, Swing, JavaFX & SWT 17
J JMenuBar ist geaddet, aber nicht im Frame. Wo ist der Fehler? (inkl. Code) AWT, Swing, JavaFX & SWT 2
B Swing Laden von serialisierten Objekten (invalid type code AC)) AWT, Swing, JavaFX & SWT 3
S Swing Scrollpanes: wie kann ich durch Java-Code an den "Anfang" scrollen AWT, Swing, JavaFX & SWT 8
J prinzipielles verständnis für Oberfläche/Code-trennung AWT, Swing, JavaFX & SWT 5
A Applet Applet aus Code neu starten AWT, Swing, JavaFX & SWT 2
C 2D-Grafik BufferedImage laden, Frage zum Code AWT, Swing, JavaFX & SWT 2
M JFileChooser setCurrentDirectory() - Verzeichnis relativ zum Code/binary AWT, Swing, JavaFX & SWT 14
L ListSelectionListener durch Code auslösen AWT, Swing, JavaFX & SWT 3
S 2D-Grafik Warum funktioniert dieser Code ? (GUI) AWT, Swing, JavaFX & SWT 9
M ActionListener mit code!!! auslösen AWT, Swing, JavaFX & SWT 3
hdi SWT Shell: Auslagerung von Code verändert Verhalten AWT, Swing, JavaFX & SWT 6
data89 Code-completion-window erzeugen - wie? AWT, Swing, JavaFX & SWT 2
C JTree per code selektierte Node wird nicht farbig hinterlegt AWT, Swing, JavaFX & SWT 2
K Swing GUI code tutorials? AWT, Swing, JavaFX & SWT 5
P Swing [gelöst/erledigt] Gleicher Code läuft unterschiedlich unter Linux und Windows AWT, Swing, JavaFX & SWT 5
G Code Blöcke AWT, Swing, JavaFX & SWT 6
S swt table mit checkboxen: wie nachträglich im code setzen? AWT, Swing, JavaFX & SWT 6
PAX Iconified JFrame per Code wieder anzeigen lassen (deiconify) AWT, Swing, JavaFX & SWT 2
O Source Code für "javax.swing.JLabel" ? AWT, Swing, JavaFX & SWT 2
T Öffnen von SWT-Dialogboxen durch HTML-Link in HTML-Code AWT, Swing, JavaFX & SWT 4
Z habe code, habe fehler, habe keine lösung AWT, Swing, JavaFX & SWT 7
P HTMLDocument in einem JTextPane. Anhängen von HTML-Code AWT, Swing, JavaFX & SWT 2
R Sun tutorial code von jcombobox mit image im combobox fehlt! AWT, Swing, JavaFX & SWT 3
S Unterschiedliche Optik trotz gleicher Look and Feel Code? AWT, Swing, JavaFX & SWT 11
M Code umbauen ? AWT, Swing, JavaFX & SWT 7
C GUI passt sich nicht dem Code an! AWT, Swing, JavaFX & SWT 4
7 Latex/MathML Code in JTextPane AWT, Swing, JavaFX & SWT 2
B Code Architektur verbessern. AWT, Swing, JavaFX & SWT 4
R Syntax Highlighting von Java-Code AWT, Swing, JavaFX & SWT 2
O Swing Event / in GUI oder im Code ausgelöst ? AWT, Swing, JavaFX & SWT 2
J eventhandling / Problemmeldung Bitte schaut euch den Code an AWT, Swing, JavaFX & SWT 2
M Code Schloss AWT, Swing, JavaFX & SWT 11
C wysiwyg Editor zum Einbinden in meinem Code AWT, Swing, JavaFX & SWT 14
m@nu JComboBox & ItemListener: per Code 1. Item wählen AWT, Swing, JavaFX & SWT 2
M Mit JTextPane erstelltes Dokument als HTML-Code ausgeben AWT, Swing, JavaFX & SWT 4
H Code nach dem schließen eines Fensters ausführen? AWT, Swing, JavaFX & SWT 3
M Was halter iht von diesem Code? AWT, Swing, JavaFX & SWT 7
B Deklaration von vielen Buttons mit Schleife vereinfachen? AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben