JavaFX Optimierung für verschiedene Auflösungen

sharkattack

Mitglied
Hallo zusammen

Ich arbeite noch nicht lange mit Java, bzw. JavaFX und bin gerade dabei ein Adressbuch zu programmieren. Die wichtigsten Funktionen konnte ich bereits erfolgreich erstellen und das Programm wird langsam brauchbar. ;)

Was mich aber noch stört, ist dass meine Anwendung auf meine Auflösung, bzw. Bildschirmgrösse ausgerichtet ist. Ich benutze einen 4k Fernseher mit 65 Zoll als Monitor. Ich habe die Fenstergrösse, Schriftgrössen, Buttons, usw. nun alle manuell im SceneBuilder angepasst, damit sie auf meinem Fernseher eine angenehme Grösse haben.
Was ich bis jetzt so gelesen habe, sollte man css benutzen, um die verschiedenen Elemente anzupassen. Kann man mit css eigentlich auch die Fenstergrösse einstellen, also das was im Moment in der fxml Datei mit
Code:
<AnchorPane prefHeight="1080.0" prefWidth="1920.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
definiert ist? Wie realisiert man es am besten, dass das Programm möglichst unabhängig von Bildschirmgrössen und Auflösungen ist? Kann man beim Start des Programms die Auflösung und Bildschirmgrösse auslesen lassen und dann entsprechend eine passende css Datei dafür definieren?

LG
 

dzim

Top Contributor
Hm... Betriebssystem? Also JavaFX 8 sollte unter Mac mehr oder minder out-of-the-box skalieren und auf Windows auch. Nur Linux ist da noch unbrauchbar. Ändert sich wohl mit Java 9, hab es aber noch nicht probiert.
Wir entwickeln gerade eine recht grosse Anwendung, die auf Windows 10 Hi-Res und Standard gut aussieht, ohne dass wir etwas machen mussten.
 

sharkattack

Mitglied
Und nochmals besten Dank für deine Antwort. :)
Ich benutze tatsächlich Linux und habe es bisher nur dort getestet. Eigentlich schreibe ich das Programm haupsächlich für meinen Vater, der ein Windows 7 installiert hat. So ganz verstehe ich allerdings noch nicht, wie das funktioniert. Ich habe ja in meinen fxml Dateien die bevorzugte grösse eingestellt. Für meinen 4k Fernseher habe ich es so eingestellt, dass die Anwendung in der Grösse von etwa einem Viertel des Bildschirm startet (1920x1080). Was passiert jetzt, wenn ich den selben Code auf einer anderen Auflösung ausführen lasse? Ich glaube mein Vater hat nur 1280x1024. Wird das Fenster dann automatisch verkleinert? Falls ja, wie wird es verkleinert? Auf die grösst mögliche Art? Also auf 1280x1024?
Und die CSS muss ich ja so oder so anpassen, oder? Weil bei 1280x1024 sind ja dann die Schriften viel zu gross.

Für ein paar Infos wäre ich dir sehr dankbar.
LG
 

dzim

Top Contributor
Die Skalierung ist automatisch. Du arbeitest - in Theorie - mit desity-independent Pixel. Also wenn du 1px sagst, schaut er, wie der Skalierungsfaktor auf dem jeweiligen System ist (100%, 120%, ...).
Bei deinem Vater würde das Programm nun also über die Grenzen des Monitors hinausgehen...

#edit: zu schnell abgeschickt: du kannst verschiedene CSS für verschiedene Systeme anbieten. im ".root" kannst du dann die generelle Skalierung für Schriften etc. setzen. Knifflig wird es etwas, wenn du noch so etwas wie FontAwesomeFX verwendest (sind ein paar Extra-CSS-Zeilen notwendig - kann dir bei Bedarf helfen).

Bsp.:
Code:
.root {
    /* ... alle deine globalen Settings und Variablen ... */
    -fx-font-size: 1.2em;
}

/* fix für FontAwesomeFX - MaterialDesignWebIcons */
MaterialDesignIconView {
    /* bescheuert, aber durch einen Bug, oder wenigstens ein bekanntes Problem, muss explizit noch mal die Font-Family gesetzt werden, sonst hast du statt Icons Vierecke/Artefakte */
    -fx-font-family: 'Material Design Icons';
    -fx-font-size: 16; /* Basis-Grösse setzen */
}
 
Zuletzt bearbeitet:

sharkattack

Mitglied
Danke schon mal für die Antwort. Das war eigentlich auch meine Idee, es mit mehreren CSS zu machen. Ich weiss aber nicht genau, wie ich es hinbekommen, dass das Programm bei meinem Vater nicht über die Grenzen hinausgeht. :) Muss ich das irgendwie im Code machen, indem ich beim Programmstart die aktuelle Auflösung abfrage und dann den Namen der jeweiligen CSS einer Variablen zuweise und das CSS (mittels Variable) dann im Code der fxml zuweisen?

Tut mir Leid, für die vielleicht etwas dumme Frage, aber was bedeutet -fx-font-size: 1.2em; Hab ich jetzt schon ein paar mal gesehen und werde nicht so richtig schlau daraus. Bei den Schriften steht in ein paar CSS Dateien bei font-size pt, px oder eben em.
 

dzim

Top Contributor
CSS-Einheiten: https://www.w3.org/Style/Examples/007/units.de.html
Es ist eine Schriftartabhängige Grössenangabe. Würde ich für Text immer verwenden, für alles andere nutze ich im Normalfall px (ich glaube, nichts hinzuschreiben, bedeutet auch px - bin mir aber nicht zu 100% sicher).

Die Displaygrösse kannst du recht einfach in Erfahrung bringen:
Ein Beispiel aus einer Example-App (JavaFX für Dektop & Mobile), bei der ich Probleme hatte und mir ein paar der Entwickler des Frameworks/der Runtime für Mobile geholfen haben.
https://github.com/bgmf/example/blob/master/ExampleProject/src/main/java/eu/dzim/example/Main.java
Diese verwendet immer Full-Screen (logisch, für Mobile).

Für eine unserer Anwendungen speichern wir die Position und die Grösse (auch im Multi-Monitor-Betrieb) und laden sie beim Start.
Beispiel:
Diese Klasse enthält die ein-/ausgelesenen Daten:
https://github.com/bgmf/poc/blob/master/shared/src/main/java/eu/dzim/shared/fx/util/WindowSetup.java

In den Utils hier werden sie aus dem "ConfigService" (lädt eine lokale JSON-Konfigurationsdatei) gelesen oder geschrieben.
https://github.com/bgmf/poc/blob/37...ava/eu/dzim/shared/util/SharedUtils.java#L318

In meine Application-Klasse, im #start-Block, lese ich es so aus:
Java:
WindowSetup windowSetup = SharedUtils.windowSetup(primaryStage, configService);
Scene scene = new Scene(root, windowSetup.getWidth(), windowSetup.getHeight());
und so wird es beim Schliessen des Programms gespeichert ():
Java:
CoreUtils.saveWindowSetup(
    configService,
    new WindowSetup.Builder()
        .maximized(stage.isMaximized())
        .width(stage.getWidth())
        .height(stage.getHeight())
        .posX(stage.getX())
        .posY(stage.getY())
        .build()
);
Das kann man in etwa so machen, dass man den Code von oben vor dem Schliessen über einen Listener auf Window-Events triggert:
Java:
// Method #start(Stage)
primaryStage.setOnCloseRequest(this::handleCloseRequest);
// the rest

private void handleCloseRequest(WindowEvent event) {
    // ... do your thing ...
}

Ist alles vielleicht etwas viel auf einmal, aber vielleicht kannst du ja ein paar Impressionen daraus mitnehmen...
 

sharkattack

Mitglied
Entschuldige bitte die späte Antwort, aber ich bin gestern nicht mehr dazu gekommen. Vielen Dank für die ausführlichen Informationen. Ist zwar im Moment etwas viel für mich, aber das mit der Displaygrösse in Erfahrung bringen habe ich schon mal getestet. Bei meinem Fernseher zeigt es 3840 x 2120 an, was ja ziemlich genau passt. Komisch finde ich allerdings die Anzeige bei meinem kleinem Notebook. Es hat laut Menü eine Auflösung von 3200 x 1800, mit der Methode von oben zeigt es aber nur 1280 x 680 an. An was liegt das? Oder verstehe ich da etwas komplett falsch?

LG
 

AndyJ

Bekanntes Mitglied
Es gibt ja immer noch das AWT, probier mal:
Toolkit.getDefaultToolkit().getScreenSize();
Toolkit.getDefaultToolkit().getScreenResolution();

Cheers,
Andy
 

dzim

Top Contributor
Mit Java9 (wenn du Module verwendest) müsstest du dann aber eine unnötig grosse Dependency reinziehen, nur um das zu erfahren.

Java:
final Screen primaryScreen = Screen.getPrimary();
final Rectangle2D visualBounds = primaryScreen.getVisualBounds();
Das macht haargenau das Selbe.

Generell bietet die Klasse Screens alles, was man in JavaFX benötigt und man muss nicht nach AWT schauen (was schlechter supportet ist, da eigentlich EOL): https://docs.oracle.com/javase/8/javafx/api/javafx/stage/Screen.html
z.B.: #getDpi um die - überraschend - DPI-Settings auszulesen.

Interessant ist vielleicht auch:
http://news.kynosarges.org/2015/06/29/javafx-dpi-scaling-fixed/
-> http://mail.openjdk.java.net/pipermail/openjfx-dev/2015-June/017337.html
-> http://mail.openjdk.java.net/pipermail/openjfx-dev/2015-June/thread.html#17337
https://stackoverflow.com/questions/26182460/javafx-8-hidpi-support

Eine Suche nach "javafx get dpi scaling factor" liefert so einige Tipps...
 

sharkattack

Mitglied
Besten Dank für die Antworten. Ich habe es vorhin mal bei meinem Vater getestet und dort ist die Ausgabe korrekt. Jedenfalls habe ich jetzt die CSS Datei so angepasst, dass die Darstellung bei ihm und auch auf meinem Notebook schon ziemlich gut ist.

Zwei Sachen aber stören mich im Moment noch. Ich habe ein ImageView, wo der Benutzer ein Bild auswählen kann. Leider ist die Darstellung bei meinem Vater und auf dem Notebook zu gross, da ich die Grösse des Bildes auf meinem 4k definiert habe. Ich habe verschiedene Einstellungen in der CSS versucht, aber scheinbar lässt sich die Grösse vom ImageView nicht per CSS ändern. Wie könnte ich das am Besten lösen? Vermutlich könnte ich die Grösse im Controller-Code anpassen, das wollte ich allerdings vermeiden. Gibt es da andere Möglichkeiten, oder muss das direkt im Code angepasst werden?
Dasselbe Problem habe ich mit den Abständen (topAnchor, usw.), auch wenn es dort nicht so schlimm ist und man dort einen Kompromiss zwischen den Auflösungen finden kann. Soweit ich gesehen habe, gibt es auch dort keine Möglichkeit diese direkt in der CSS zu definieren.

JavaFX gefällt mir wirklich sehr gut, aber diese zwei Punkte, sofern sie wirklich nur über den Code selber gelöst werden können, stören mich noch etwas. Des Weiteren ist mir der SceneBuilder unter Linux schon ein paar mal eingefroren, zwei dreimal sogar die gesamte Desktop-Umgebung. ;)

Noch eine letzte Frage hätte ich zur CSS. Ich habe jetzt in der gesamten CSS die Schriftgrössen mit em Werten angegeben. Nur im root selber habe ich px genommen. Wenn ich jetzt die px im root anpasse, ändern sich die Grössen überall, was auch gut so ist. :) Weiter oben in deinem Code habe ich aber gesehen, dass du die Schrifftgrösse auch im root mit em definiert hast. Was ist da aber dann der Referenzwert? Ich habe die Schrift im root jetzt auf 16px definiert, also weiss ich, dass alle Schriften, bei denen ich 1em gesetzt habe, 16px gross sind. Wenn aber in der root ein em Wert steht, gibt es ja keinen Referenzwert. Oder gibt es da einen Standardwert?

LG
 

dzim

Top Contributor
Beim ImageView kannst du im Controller fitWidth oder fitHeight verwenden (ich sage bewusst *oder*). Wichtig ist, dass du preserveRatio auf true setzt. Dann müsstest du die fit[Width|Height]Property() an die Höhe/Breite vom Parent oder so binden, so dass diese sich immer anpasst. Verwendest du also ein High-Res-Bild für 4K, sollte es sich so automatisch skalieren, wenn du das Fenster verkleinerst, und/oder eben die Anwendung auf einem Bildschirm mit niedriger Auflösung dargestellt wird. Ich verwende relativ selten Bilder mittels CSS - kann dir aber nicht sagen, warum. :D

Beim AnchorPane kann ich dir leider weniger helfen, da ich mich damit nie gross beschäftigt habe. Ich dachte, dass auch dort die density-independen Pixel verwendet werden, aber ich muss passen. Kann dir da keine Tipps oder so geben. Einfach ein wenig experimentieren. Vielleicht auch mal mit anderen Layouts (MigPane? nie Probiert, gibt's aber auch für JavaFX…).

Ich verwende den Scene Builder nicht. Unter IntilliJ verwende ich nur den reinen FXML-Support, in Eclipse (wenn ich GTK2 forciere, ansonsten crasht Eclipse) den e(fx)clipse gelieferten Preview-View und die nach FXML übersetzende DSL "FXGraph". Hatte daher das Problem noch nie.

Genau: Es gibt einen Standard-Wert (bzw. muss ihn geben). Er wird hier beschrieben, aber ich glaube, er ist Hard-Coded im JDK. (Merke: glauben, ist nicht wissen…)
Der im ".root" verwendete Wert wird dann wiederum als Basis für die anderen verwendet. Schreibst du also im ".root" 1.2em und woanders für eine spezielle Klasse wieder 1.2em, so wird das noch auf den Basiswert aus ".root" oben drauf gerechnet. So sieht es für mich immerhin aus, als ich es einmal ausprobiert habe.
 

sharkattack

Mitglied
Vielen Dank dzim für deine wertvollen Informationen und die Geduld mit mir. :) Ich werde deine Tipps versuchen und mich vielleicht bei Unsicherheiten wieder melden. :D Im Moment brauche ich mal eine kurze Pause von den GUIs und arbeite an weiteren Funktionen meines Programms (Export für Thunderbird und Outlook). Dann widme ich mich wieder der Oberfläche. ;)

LG und besten Dank nochmals
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Eldorado Swing Optimierung eines TableModels AWT, Swing, JavaFX & SWT 2
W Optimierung bei JTable Verwendung AWT, Swing, JavaFX & SWT 3
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 21
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
komplettlost Vollbildmodus für MacOs Nutzer geht nicht AWT, Swing, JavaFX & SWT 13
D JavaFX Schadensberechnung für Kartenspiel AWT, Swing, JavaFX & SWT 1
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
L actionListener für Button AWT, Swing, JavaFX & SWT 97
izoards Textfeld für Zeit AWT, Swing, JavaFX & SWT 4
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
T Button für GUI programmieren AWT, Swing, JavaFX & SWT 1
Z Switch Case für Buttons AWT, Swing, JavaFX & SWT 8
M Hough-Transformation für Kreise und andere Formen AWT, Swing, JavaFX & SWT 3
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
E Keystroke für Ausschneiden läßt sich nicht ändern AWT, Swing, JavaFX & SWT 2
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
MiMa Package Struktur für GUI Programmierung AWT, Swing, JavaFX & SWT 26
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
B eclipse für JavaFx setuppen AWT, Swing, JavaFX & SWT 4
K Swing Struktur für TreeTable rekursiv aufbauen AWT, Swing, JavaFX & SWT 17
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
H Ein Patten für das Gluon Mobile Framework AWT, Swing, JavaFX & SWT 7
J Gibt es einen Grund für 16x16 anstatt z.B. 15x15 Tiles ? AWT, Swing, JavaFX & SWT 10
F JFormattedTextField für kg und Währung AWT, Swing, JavaFX & SWT 6
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
Soloeco JavaFX Dreifachklick für MenuButton erforderlich AWT, Swing, JavaFX & SWT 2
L JavaFX Lösungsvorschläge für dieses coole Control AWT, Swing, JavaFX & SWT 8
looparda Suche Lib für Visualisierung von Graphen AWT, Swing, JavaFX & SWT 12
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
S Swing Finde Grund für NullPointerExeption nicht. AWT, Swing, JavaFX & SWT 2
W JavaFX (j)Unittests für GUI AWT, Swing, JavaFX & SWT 0
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
SchmidiMC Swing Vorschläge für ein Design AWT, Swing, JavaFX & SWT 5
Z JavaFX Pane für wechselnde Sub-Panes mit Auto-Resize AWT, Swing, JavaFX & SWT 2
S 2D-Grafik affine Transformation für Text-Shape AWT, Swing, JavaFX & SWT 0
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
kodela Accalerator für einige Menüoptionen funktioniert nicht mehr AWT, Swing, JavaFX & SWT 3
P Swing Empfehlungen für einfaches Computerspiel AWT, Swing, JavaFX & SWT 4
L DragDropped für jede Node AWT, Swing, JavaFX & SWT 0
temi JavaFX Lösungsansatz für Umsetzung gesucht AWT, Swing, JavaFX & SWT 4
J Swing JavaProgramm für Verschlüssen für eine Datei AWT, Swing, JavaFX & SWT 19
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
MiMa Programmeinstellungen für Anwendung?? AWT, Swing, JavaFX & SWT 54
heinz ketchup While-Schleife in einem Service für GUI AWT, Swing, JavaFX & SWT 22
L JavaFX Renderer für JavaFX AWT, Swing, JavaFX & SWT 2
MiMa GUI Controller für Border Pane als MVC Modell AWT, Swing, JavaFX & SWT 1
L Font für Dashboard AWT, Swing, JavaFX & SWT 3
F Swing JColorChooser für die JToggleButtons AWT, Swing, JavaFX & SWT 5
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
T Swing Drag and Drop für JComponents AWT, Swing, JavaFX & SWT 1
Kloso Swing Pseudocode für Strafurzeichnung AWT, Swing, JavaFX & SWT 4
F Konstruktor für "Vier Gewinnt" AWT, Swing, JavaFX & SWT 10
L JavaFX PdfViewer für JavaFX Anwendung AWT, Swing, JavaFX & SWT 6
R Swing Welche LayoutManager sind die richtigen für mich? AWT, Swing, JavaFX & SWT 11
L Event Handling Gui für Taschenrechner AWT, Swing, JavaFX & SWT 27
C Slider für Zeitauswahl AWT, Swing, JavaFX & SWT 3
M Limit für JFrame-Vergrößerung AWT, Swing, JavaFX & SWT 8
GreenTeaYT Button funktioniert nicht für Ein-und Auszahlungen? AWT, Swing, JavaFX & SWT 8
K Liniendicke für Line Chart dynamisch ändern AWT, Swing, JavaFX & SWT 0
K JButton nicht sichtbar machen für User 2 AWT, Swing, JavaFX & SWT 4
OnDemand Gui Themes für FX AWT, Swing, JavaFX & SWT 4
G DefaultListModel für JList AWT, Swing, JavaFX & SWT 2
P JavaFX Kalender mit Kacheln für Ereignisse AWT, Swing, JavaFX & SWT 4
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
J Swing Neuen Command für "show"? AWT, Swing, JavaFX & SWT 2
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
H Swing JFileChooser für nicht existierendes Unterverzeichnis AWT, Swing, JavaFX & SWT 3
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
D GUI-Bau für ein Auswertungs-Tool AWT, Swing, JavaFX & SWT 11
L Swing CellRenderer für einzelne Zellen? AWT, Swing, JavaFX & SWT 5
RalleYTN Swing Menü für Texteditor (Rechtsklick) AWT, Swing, JavaFX & SWT 4
H Applet Flappy Bird für Noobs AWT, Swing, JavaFX & SWT 4
X JavaFX Tooltips für XYChart-Knoten werden nicht angezeigt! AWT, Swing, JavaFX & SWT 3
Thallius Swing Aufgabe für einen der gerne Tüftelt. AWT, Swing, JavaFX & SWT 4
A hilfe für flowlayout AWT, Swing, JavaFX & SWT 6
B EventHandler für durch Tastenkombination erzeugte Zeichen AWT, Swing, JavaFX & SWT 3
T Hintergrund für GUI AWT, Swing, JavaFX & SWT 1
L JavaFX TableView mit Attributs der Modellreferenzerierung für die Spalte AWT, Swing, JavaFX & SWT 3
C JavaFX Character Comparator für TableColumn AWT, Swing, JavaFX & SWT 0
KrokoDiehl JavaFX Gleiche Controller-Instanz für inludiertes FXML AWT, Swing, JavaFX & SWT 1
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1
S Pfad für Speichervorgang auswählen AWT, Swing, JavaFX & SWT 11
M If für viele TextFields AWT, Swing, JavaFX & SWT 7
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
R JMenuItems für Touchscreen auseinanderziehen AWT, Swing, JavaFX & SWT 3
L LookAndFeel Eigenes Design für die Applikation AWT, Swing, JavaFX & SWT 4
G Grafikformat für AWT-Applet? AWT, Swing, JavaFX & SWT 0
J Java -8 Action Listener für mehrere Buttons AWT, Swing, JavaFX & SWT 9

Ähnliche Java Themen

Neue Themen


Oben