2017-01-05 1 views
0

Ich habe mit diesem Problem für ein paar Stunden gekämpft und es geschafft, das Problem mit dem Beispiel unten zu reproduzieren. Das aktuelle Programm ändert, was in main.add(node, 0, 1) als Inhalt basierend auf der Schaltfläche in menu festgelegt ist. Ich habe verschiedene Dinge wie AnchorPanes, setMaxHeight und setVgrow für viele verschiedene Knoten in jedem Bereich ausprobiert, war aber nicht sehr erfolgreich. Wie würde ich die ListView in dem Beispiel füllen den Rest der Höhe des Fensters, wo es sich befindet?JavaFX Node wird trotz Beschränkungen nicht wachsen, wenn sie innerhalb einiger Bereiche vergraben

public class Main extends Application { 

    public void start(Stage stage) throws Exception { 
     // I've tried with this as a VBox, no effect. 
     GridPane main = new GridPane(); 
     main.setGridLinesVisible(true); 
     main.setHgap(5); 
     main.setVgap(10); 

     // Meant to change what content is displayed in the actual program. 
     HBox menu = new HBox(); 
     menu.setMaxWidth(Double.MAX_VALUE); 
     menu.setAlignment(Pos.CENTER); 
     main.add(menu, 0, 0); 
     GridPane.setHgrow(menu, Priority.ALWAYS); 
     menu.getChildren().addAll(new Button("Button 1"), new Button("Button 2"), new Button("Button 3"), new Label("Hello world!")); 

     // Changes often. 
     GridPane content = new GridPane(); 
     main.add(content, 0, 1); 

     // Options for the displayed content, changes the StackPane displayed below in my actual program. 
     HBox submenu = new HBox(); 
     submenu.setMaxWidth(Double.MAX_VALUE); 
     submenu.setAlignment(Pos.CENTER); 
     content.add(submenu, 0, 0); 
     GridPane.setHgrow(submenu, Priority.ALWAYS); 
     submenu.getChildren().addAll(new Button("Button A"), new Button("Button B"), new Button("Button C"), new Label("Hello world!")); 

     // This is a custom class extended by StackPane in my actual program. Is often over overlayed with another transparent StackPane (not relevant to the problem). 
     StackPane subcontent = new StackPane(); 
     subcontent.setMaxHeight(Double.MAX_VALUE); 
     subcontent.setMaxWidth(Double.MAX_VALUE); 
     content.add(subcontent, 0, 1); 

     // This was meant to be a TabPane in my actual program but this has the same outcome that won't fill the rest of the window height. 
     ListView<String> list = new ListView<>(); 
     list.setMaxHeight(Double.MAX_VALUE); 
     list.setMaxWidth(Double.MAX_VALUE); 
     ObservableList<String> items = FXCollections.observableArrayList(); 
     list.setItems(items); 

     subcontent.getChildren().add(list); 

     for(int i=0; i<100; i++) { 
      items.add("# "+i); 
     } 

     Scene scene = new Scene(main, 900, 550); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

Antwort

2

Sie benötigen beide

GridPane.setVgrow(content, Priority.ALWAYS); 

und

GridPane.setVgrow(subcontent, Priority.ALWAYS); 

Die Rasterscheiben auf ihre bevorzugten Höhen mit der Standard-Größe Dinge gehen vgrow: die bevorzugte Höhe von content bestimmt wird durch die bevorzugte Höhe (n) seiner Kindknoten, und die bevorzugte Höhe eines ListView ist eine feste (willkürliche) Größe (ich glaube 400 Pixel). Also, wenn Sie nicht subcontent zu wachsen, wird es durch die bevorzugte Größe der Listenansicht, und zwingen content zu wachsen wird nur zusätzliche (leere) Leerzeichen zu content hinzufügen: Wenn Sie nicht erzwingen content zu wachsen, wird es nehmen Sie ihre bevorzugte Größe, die die bevorzugte Größe von subcontent plus die bevorzugte Größe von submenu ist.

die maximale Höhe Einstellung nicht in diesem Beispiel etwas tun, wie Sie gerade den verschiedenen Knoten zu ermöglichen, müssen über ihre bevorzugte Größe wachsen:

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.geometry.Pos; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.ListView; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.Priority; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class Main extends Application { 

    public void start(Stage stage) throws Exception { 
     // I've tried with this as a VBox, no effect. 
     GridPane main = new GridPane(); 
     main.setGridLinesVisible(true); 
     main.setHgap(5); 
     main.setVgap(10); 

     // Meant to change what content is displayed in the actual program. 
     HBox menu = new HBox(); 
//  menu.setMaxWidth(Double.MAX_VALUE); 
     menu.setAlignment(Pos.CENTER); 
     main.add(menu, 0, 0); 
     GridPane.setHgrow(menu, Priority.ALWAYS); 
     menu.getChildren().addAll(new Button("Button 1"), new Button("Button 2"), new Button("Button 3"), new Label("Hello world!")); 

     // Changes often. 
     GridPane content = new GridPane(); 
     main.add(content, 0, 1); 

     // Options for the displayed content, changes the StackPane displayed below in my actual program. 
     HBox submenu = new HBox(); 
//  submenu.setMaxWidth(Double.MAX_VALUE); 
     submenu.setAlignment(Pos.CENTER); 
     content.add(submenu, 0, 0); 
     GridPane.setHgrow(submenu, Priority.ALWAYS); 
     submenu.getChildren().addAll(new Button("Button A"), new Button("Button B"), new Button("Button C"), new Label("Hello world!")); 

     // This is a custom class extended by StackPane in my actual program. Is often over overlayed with another transparent StackPane (not relevant to the problem). 
     StackPane subcontent = new StackPane(); 
//  subcontent.setMaxHeight(Double.MAX_VALUE); 
//  subcontent.setMaxWidth(Double.MAX_VALUE); 
     content.add(subcontent, 0, 1); 


     // This was meant to be a TabPane in my actual program but this has the same outcome that won't fill the rest of the window height. 
     ListView<String> list = new ListView<>(); 
//  list.setMaxHeight(Double.MAX_VALUE); 
//  list.setMaxWidth(Double.MAX_VALUE); 
     ObservableList<String> items = FXCollections.observableArrayList(); 
     list.setItems(items); 

     subcontent.getChildren().add(list); 

     for(int i=0; i<100; i++) { 
      items.add("# "+i); 
     } 

     GridPane.setVgrow(content, Priority.ALWAYS); 
     GridPane.setVgrow(subcontent, Priority.ALWAYS); 


     Scene scene = new Scene(main, 900, 550); 
     stage.setScene(scene); 
     stage.show(); 

    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

Dank! Ihre Erklärung half, einen Sinn für das zu entwickeln, was vor sich ging. –

Verwandte Themen