Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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
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?
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 Code [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? ...").
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)
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...
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
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!
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.
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)
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?
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
@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:
Code:
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
-->
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...
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
#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...
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.