2017-08-09 2 views
0

Ich versuche, das StackPane im <left> Element meines Haupt-BorderPane die volle vertikale Höhe des Fensters einnehmen zu lassen, auch wenn seine Größe geändert wird. Wie kann ich das machen? Dies ist, was ich bisher habe:Wie kann ich erreichen, dass mein StackPane die volle vertikale Höhe des Fensters einnimmt?

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.ListView?> 
<?import javafx.scene.control.MenuBar?> 
<?import javafx.scene.control.ScrollPane?> 
<?import javafx.scene.control.ToolBar?> 
<?import javafx.scene.Group?> 
<?import javafx.scene.image.Image?> 
<?import javafx.scene.image.ImageView?> 
<?import javafx.scene.layout.*?> 

<VBox prefWidth="800.0" prefHeight="600.0" xmlns="http://javafx.com/javafx/8.0.112" xmlns:fx="http://javafx.com/fxml/1"> 
    <VBox alignment="TOP_CENTER"> 
     <ToolBar minHeight="50.0" prefHeight="50.0" prefWidth="800.0" stylesheets="@style.css" GridPane.rowIndex="1"> 
      <ImageView fitHeight="35.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true"> 
       <Image url="@react-toolbar-logo.png"/> 
      </ImageView> 
     </ToolBar> 
     <MenuBar fx:id="menuBar" prefHeight="0.0" prefWidth="0.0"/> 
    </VBox> 

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

     <left> 
      <StackPane prefWidth="230"> 
       <ListView fx:id="listView"/> 
      </StackPane> 
     </left> 
     <right> 
      <StackPane> 
       <ScrollPane> 
        <Group fx:id="selectionGroup"> 
         <ImageView fx:id="mainImageView"/> 
        </Group> 
       </ScrollPane> 
      </StackPane> 
     </right> 

    </BorderPane> 
</VBox> 
+1

Die volle Höhe des * Fenster * oder die volle Höhe der * BorderPane *? Die VBox mit der Ausrichtung top_center verhindert, dass Sie die erstere ausführen (es sei denn, Sie organisieren Dinge neu). – Michael

Antwort

3

Der Stapelbereich (und folglich die ListView: Ich bin mir nicht sicher, warum Sie die ListView in einem StackPane wickeln müssen) bereits ist die volle Höhe des Grenzbereiches zu füllen. Sie können dies z.B. durch Ändern der Hintergrundfarbe des Rahmenbereichs. Das Problem ist, dass der Bereich "Rahmen" nicht erweitert wird, um den gesamten verfügbaren Platz in der Umgebung zu füllen VBox.

Wenn Sie die BorderPane füllen den verbleibenden Raum lassen wollen, setzen Sie seine VBox.vgrow Eigenschaft auf ALWAYS:

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.ListView?> 
<?import javafx.scene.control.MenuBar?> 
<?import javafx.scene.control.ScrollPane?> 
<?import javafx.scene.control.ToolBar?> 
<?import javafx.scene.Group?> 
<?import javafx.scene.image.Image?> 
<?import javafx.scene.image.ImageView?> 
<?import javafx.scene.layout.*?> 
<?import java.lang.Double?> 

<VBox prefWidth="800.0" prefHeight="600.0" xmlns="http://javafx.com/javafx/8.0.112" xmlns:fx="http://javafx.com/fxml/1"> 

    <VBox alignment="TOP_CENTER"> 
     <ToolBar minHeight="50.0" prefHeight="50.0" prefWidth="800.0" GridPane.rowIndex="1"> 
      <ImageView fitHeight="35.0" fitWidth="200.0" pickOnBounds="true" preserveRatio="true"> 
       <Image url="@react-toolbar-logo.png"/> 
      </ImageView> 
     </ToolBar> 
     <MenuBar fx:id="menuBar" prefHeight="0.0" prefWidth="0.0"/> 

    </VBox> 

    <BorderPane VBox.vgrow="ALWAYS"> 

     <left> 
      <StackPane prefWidth="230"> 
       <ListView fx:id="listView" /> 
      </StackPane> 

     </left> 
     <right> 
      <StackPane> 
       <ScrollPane> 
        <Group fx:id="selectionGroup"> 
         <ImageView fx:id="mainImageView"/> 
        </Group> 
       </ScrollPane> 
      </StackPane> 
     </right> 

    </BorderPane> 

</VBox> 
+0

Das hat mein Problem gelöst. Vielen Dank. – santafebound

1

Binden Sie die entsprechenden Werte. Wenn Sie möchten, dass ein untergeordnetes Element immer die Größe seines übergeordneten Elements ausfüllt, können Sie die prefHeightProperty des untergeordneten Elements an die heightProperty des übergeordneten Elements binden. , die in Java-Code wie

child.prefHeightProperty().bind(parent.heightProperty);

oder in fxml wie

<ListView fx:id="listView" prefHeight="${listView.parent.width}"/>

Check out Oracle's description about bindings…

+1

Bindungseigenschaften, um das Layout anzupassen, scheint immer wie ein Hack für mich. Verwenden Sie die Eigenschaften der Layoutbereiche oder Einstellungen direkt auf den untergeordneten Knoten, um das Layout zu beeinflussen. –

+0

Obwohl es vielleicht hackisch wirkt, kann es in vielen Situationen genau das tun, was Sie wollen. Du hast recht, @James_D, vielleicht gibt es weniger Möglichkeiten für Hacker. – deHaar

+0

Denken Sie nur daran, was hinter den Kulissen passiert. Während eines Layoutdurchlaufs wird die Höhe des übergeordneten Elements der Listenansicht wahrscheinlich durch seine vordefinierte Höhe bestimmt, die durch die vordefinierte Höhe der untergeordneten Knoten bestimmt wird. Wenn Sie die Pref-Höhe des Child-Knotens an die Höhe des Parents binden, arbeiten Sie bestenfalls gegen die Art und Weise, wie das Layout in JavaFX ausgeführt wird, und riskieren möglicherweise die Erzeugung einer unendlichen Rekursion oder eines Layouts, das sich bei jedem Layout-Durchlauf schlimmstenfalls ändert . –

1

Es möglich ist, klingt wie Sie Ihr Layout restrukturieren wollen wie so , aber ich denke, dass Sie möglicherweise genau klären müssen, was Sie suchen.

<BorderPane xmlns:fx="http://javafx.com/fxml"> 
    <left> 
     <StackPane> ... </StackPane> 
    </left> 
    <right> 
     <StackPane> ... </StackPane> 
    </right> 
    <top> 
     <VBox> 
      <ToolBar> ... </ToolBar> 
      <MenuBar> ... </MenuBar> 
     <VBox> 
    </top> 
</BorderPane> 
+0

Die Antwort von James_D löste letztendlich meine Anforderung an die vertikale Dehnung. :), aber das ist viel sauberer als das, was ich habe. Ich habe meine Top-Komponenten in den BorderPane verlegt. Vielen Dank. – santafebound

Verwandte Themen