# JavaFX - Komponenten skalieren



## programmierer12 (25. Jul 2014)

Hallo zusammen ich habe einmal eine Frage zu JavaFX:
Wenn ich eine Fxml-Datei habe die ein bestimmtes Format hat in der einige Komponenten sind,
kann ich  in meinem code 
	
	
	
	





```
stage.setFullScreen(true);
```
 verwenden um die Software im Vollbildmodus erscheinen zu lassen. Nun will ich aber dass sich die Komponenten auch entsprechend der Stage skalieren. Geht das mit irgendeinem Befehl oder muss ich da selbst Hand anlegen um die ganzen Größen zu ändern?

Mit freundlichen Grüßen
programmierer12


----------



## dzim (25. Jul 2014)

Erstens: Falsches Unterforum. Es gehört nach hier: AWT, Swing, JavaFX & SWT

Zweitens: Kommas setzt du frei nach Tageslaune, oder?  Dein erster (langer) Satz enthält genau eins. Gefühlt müssten da aber vier rein ("Wenn ich eine Fxml-Datei habe*,* die ein bestimmtes Format hat*,* in der einige Komponenten sind,
kann ich in meinem *C*ode [c]stage.setFullScreen(true);[/c] verwenden*,* um die Software im Vollbildmodus erscheinen zu lassen.")... Das gilt natürlich leider auch für den Folgesatz... Und generell auch für alle anderen Sätze ;-)

*ABER zr Frage:*
Ich vermute, du hast vorher noch nicht viele Oberflächen geschrieben, nicht wahr? Dein Zauberwort heisst "Layout". Du musst deine Widgets in solche verpacken (wobei Kind-Elemente von Layouts auch wieder andere Layouts sein können, um komplexe Oberflächen zu ermöglichen), damit am Ende die UI brauchbar wird. Darüber hinaus sind für einige Layouts auch noch ein paar weitere Konfigurationen nötig ("Sollen in einer HBox (Hinweis: Alle Kinder werden horizontal angeordnet) bestimmte Einträge den noch verfügbaren Platz auffüllen, oder nicht? ...").

--> Working With Layouts in JavaFX: About This Tutorial | JavaFX 2 Tutorials and Documentation (Der Link zeigt zwar noch auf die Tutorials von JavaFX2 aus Java7, und nicht auf JavaFX8 aus Java8, aber die API ist Grundsätzlich identisch.)

--> Client Technologies: Java Platform, Standard Edition (Java SE) 8 Release 8 (Allgemein werden hier die diversen Client-Technologien von Standard-Java beschrieben.)

--> JavaFX: Working with Layouts in JavaFX Release 8 - Contents (Noch mal JavaFX-Tutorials speziell für Java8.)

Happy Coding!


----------



## programmierer12 (26. Jul 2014)

Danke für deine Antwort! Ja es stimmt ich habe erst ein paar guis mit javafx gemacht aber trotzdem Danke


----------



## programmierer12 (28. Jul 2014)

Tut mir leid dass ich jetzt nochmal hier zu diesem Thema frage aber ich wollte keine neue Diskussion aufmachen. Nach deiner Antwort habe ich mir das ganze einmal angeschaut und aufgrund dessen ein Fenster mit einer BorderPane erzeugt wo im oberen Teil die MenuBar liegt. Nun habe ich ein Gridpane, dass ich mittig auf der BorderPane platziert habe. Nun möchte ich aber, dass die  Gridpane immer noch mittig liegt, wenn ich das Fenster im Vollbildmodus anzeige. Wie kann ich so etwas machen (ich meine mit den Layouts)

MFG
programmierer12


----------



## dzim (28. Jul 2014)

Ich verwende BorderPane recht selten, aber ich denke, solange es keine weiteren Child-Elemente (links, rechts oder unten) hat, wird das mittige Element immer den vollen Platz einnehmen. Evtl. Musst du da jetzt, wie gesagt, noch weitere Layouts einbetten.
Da du aber wenig - bis keine - Informationen über deine UI gibst, wird es aber auch nicht soooooo leicht, dir da brauchbar weiter zu helfen. Mach vielleicht ein Mockup und hänge es mal an deinen nächsten Post an...


----------



## programmierer12 (28. Jul 2014)

Also ich habe euch einmal einen Screenshot gemacht und auf diesem die Situation ein wenig verdeutlicht. Also, ich habe zuerst ein Fenster mit einem BorderPane im TOP Bereich eine MenuBar im BOTTOM, LEFT und RIGHT bereich habe ich, mit blau markiert, einfach Panes als Platzhalter. Und im Center, mit rot markiert, ein GridPane, dass meine Komponenten enthält.
Ich hoffe das hilft euch weiter.
MFG
programmierer12


----------



## Joose (28. Jul 2014)

programmierer12 hat gesagt.:


> Also, ich habe zuerst ein Fenster mit einem BorderPane im TOP Bereich eine MenuBar .....



Ich weiß ja nicht genau wie das bei JavaFX ist aber in Swing kann man eine JMenuBar dem Frame hinzufügen ... nicht dem Layout. Dann fügt man an der Position TOP einfach ein leeres JPanel hinzu und wenn keine fixen Größen und Abstände gegeben sind teilen sich TOP, MIDDLE/CENTER und BOTTOM den Platz gleichmäßig auf!


----------



## programmierer12 (28. Jul 2014)

In JavaFX kannst du zwar dem Fenster eine MenuBar verpassen aber diese ändert dann nicht die Größe wenn du das Fenster vergrößerst, deshalb das Borderpane.


----------



## Joose (28. Jul 2014)

Inwiefern sollte die MenuBar ihre Größe ändern?

Meiner Meinung nach soll diese immer die gleiche Höhe haben und sich nur der Länge dem Fenster anpassen (also das die Menüleiste über den ganzen Frame geht und nicht nur den benötigten Platz einnimmt)


----------



## programmierer12 (28. Jul 2014)

;(Ja du hast es erfasst, genau das habe ich gemeint. Aber das hat meine Frage eigentlich immer noch nicht beantwortet!


----------



## Joose (28. Jul 2014)

Ich kann mir nicht vorstellen das man JavaFX explizit eine MenuBar setzen kann, diese aber nicht ihre Länge an das Fenster anpasst! (So wäre JavaFX nicht zu gebrauchen für Anwendungen mit Menü)

Kann es sein das du der MenuBar eine entsprechende Weite gegeben hast und sich die Größe daher nicht angepasst hat?


----------



## programmierer12 (28. Jul 2014)

Ja du musst der MenuBar eine explizite Size geben, deshalb habe ich sie ja auch in das BorderPane gepackt. Aber anstatt dich damit zu befassen(was meiner Meinung nach total überflüssig und sinnlos ist) könntest du ja mal schauen ob du mir bei meinem eigentlichen Problem helfen kannst.
MFG
programmierer12


----------



## dzim (28. Jul 2014)

@Joose: In JavaFX ist eine MenuBar ein Widget wie jedes andere (und so sollte es IMHO auch immer sein!). Du kannst es damit in einem Layoutz platzieren, wo du willst. Die Grösse wird dabei entweder abhängig vom Layout (BorderPane to und bottom, VBox, u.ä. in automatisch in voller Breite), oder von deinen Set-Up berechnet. Es wird also nicht explizit dem Pane via z.B. einer expliziten #setMenuBar()-Methode zugeordnet. Dadurch kann man - z.B. via CSS - die Form, Farbe, Höhe, oder was auch immer den Wünschen anpassen. Das gild natürlich auch für die Menu-Widgets oder MenuItem-Widgets.

Zum Thema:
Wenn du also den Platz links und rechts frei haben willst, kannst du es entweder via maximaler Breite/Höhe des GridPanes machen, oder indem du Platzhalter verwendest, die die verfügbare Breite einnehmen.
Ich hätte für den Fall hier vermutlich auf ein BorderPane verzichtet, aber auf jeden Fall auf das GridPane, da du nur eine Spalte verwendest: Dafür ist eher eine VBox sinnvoll.

Mittels e(fx)clipse-Plugin habe ich mir zum Test innerhalb von 5min folgende FXGraph-Datei erstellt (Das ist eine spezielle JSON-ähnliche DSL. Diese wird dann automatisch zu einer regulären FXML-Datei kompiliert).

FXGraph:

```
package application

import javafx.scene.layout.BorderPane
import javafx.scene.control.MenuBar
import javafx.scene.control.Menu
import javafx.scene.control.MenuItem
import javafx.scene.control.SeparatorMenuItem
import javafx.scene.layout.GridPane
import javafx.scene.layout.VBox
import javafx.geometry.Insets
import javafx.scene.control.TextField
import javafx.scene.control.Button
import java.lang.Double

component BorderPaneTest {
	BorderPane {
		top : MenuBar id menuBar {
			Menu id menuFile {
				text : "File",
				MenuItem id menuItemExit {
					text: "Exit"
				}
			},
			Menu id menuHelp {
				text : "Help",
				MenuItem id menuItemHelp {
					text : "Help"
				},
				SeparatorMenuItem id separatorMenuItem {
				},
				MenuItem id menuItemAbout {
					text : "About"					
				}
			}
		},
		center : VBox id vBoxCenter {
			spacing : 10,
			maxWidth : 300,
			maxHeight : 400,
			TextField id textFieldUser {
				promptText : "Username",
				alignment : "CENTER"
			},
			TextField id textFieldPasswd {
				promptText : "Password",
				alignment : "CENTER"
			},
			Button id buttonLogin {
				text:"Log in",
				alignment : "CENTER",
				maxWidth : const Double#MAX_VALUE
			},
			static margin : Insets {
				left:5,top:5,right:5,bottom:10
			},
			static alignment : "CENTER"
		}
	}
}
```

--> FXML:
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<!-- 
	Do not edit this file it is generated by e(fx)clipse from ../src/application/BorderPaneTest.fxgraph
-->

<?import java.lang.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.SeparatorMenuItem?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>

<BorderPane xmlns:fx="http://javafx.com/fxml">

	<top>
		<MenuBar fx:id="menuBar"> 
			<Menu fx:id="menuFile" text="File"> 
				<MenuItem fx:id="menuItemExit" text="Exit"/> 
			</Menu>
			<Menu fx:id="menuHelp" text="Help"> 
				<MenuItem fx:id="menuItemHelp" text="Help"/> 
				<SeparatorMenuItem fx:id="separatorMenuItem"/> 
				<MenuItem fx:id="menuItemAbout" text="About"/> 
			</Menu>
		</MenuBar>
	</top>
	<center>
		<VBox fx:id="vBoxCenter" spacing="10" maxWidth="300" maxHeight="400" BorderPane.alignment="CENTER"> 
			<TextField fx:id="textFieldUser" promptText="Username" alignment="CENTER"/> 
			<TextField fx:id="textFieldPasswd" promptText="Password" alignment="CENTER"/> 
			<Button fx:id="buttonLogin" text="Log in" alignment="CENTER"> 
				<maxWidth><Double fx:constant="MAX_VALUE" /></maxWidth>
			</Button>
			<BorderPane.margin>
				<Insets left="5" top="5" right="5" bottom="10"/> 
			</BorderPane.margin>
		</VBox>
	</center>
</BorderPane>
[/XML]

--> Screenshot:






Ignorier erst mal die hässlichen Darstellungsfehler, das könnte an meinem Linux liegen... ;-)

*#edit:* Nachtrag: Ich habe die VBox für die Textfelder und den Button allerdings immer Zentriert - vielleicht auch nicht immer das, was du willst. Und das Passwort-Feld sollte natürlich eigentlich vom Typ Password sein, nicht TextField...


----------



## programmierer12 (28. Jul 2014)

Genau das war es was ich gebraucht habe! Aber könntest du mir noch sagen was du als Platzhalter genommen hast und wie du es hin bekommen hast, dass die Komponenten immer in der Mitte sind?!

Nachtrag:
Noch ein paar Fragen
1) Wie hast du den Abstand der Komponenten in der VBox verändert?
2) Wie ist die VBox zentriert bei mir nimmt sie den gesamten Platz ein?
MFG
programmierer12


----------



## dzim (28. Jul 2014)

Wie du im FXML sehen kannst, habe ich keine Platzhalter verwendet, sondern die drei Parameter hier an der zentralen VBox 
	
	
	
	





```
maxWidth="300" maxHeight="400" BorderPane.alignment="CENTER"
```
.
Mehr nicht.

*#edit:* Du könntest es aber mal mit TOP_CENTER versuchen, das könnte für deinen Use-Case besser passen. Und bitte zieh den Post in den entprechenden Thread um...


----------



## programmierer12 (28. Jul 2014)

Also nochmal zum Verständnis - Du hast eine feste Größe benutzt?
Und jetzt noch ne gaaaanz blöde Frage wie verschiebe ich einen Post?


----------



## dzim (28. Jul 2014)

Feste Grösse: Ja.

Verschieben: Ich glaub, das kann nur ein Moderator. Also am besten das Thema hier als erledigt markieren und im anderen Unterforum dann neues Thema erstellen.

*#edit:* Feste Grösse: Jain. Ich habe eine maximale Grösse festgelegt, aber es kann schon kleiner werden, das ist noch erlaubt.


----------

