2017-01-05 7 views
0

Я пару дней боролся с этой проблемой и сумел воспроизвести проблему с образцом ниже. Фактическая программа изменяет то, что установлено в main.add(node, 0, 1), в качестве содержимого, основанного на том, какая кнопка нажата в menu. Я пробовал несколько разных вещей, таких как AnchorPanes, меняя setMaxHeight и setVgrow для разных узлов в каждой панели, но не очень успешный. Как заставить ListView в этом примере заполнить остальную высоту окна, где он находится?Узел JavaFX не будет расти в высоту, несмотря на ограничения при погребении в нескольких стеклах.

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); 
    } 
} 

ответ

2

Вам нужны оба

GridPane.setVgrow(content, Priority.ALWAYS); 

и

GridPane.setVgrow(subcontent, Priority.ALWAYS); 

Сетка стекла собираются размера вещей, их предпочтительных высот с по умолчанию vgrow: предпочтительная высота content определяется предпочтительной высоты (ов) его дочерних узлов, а предпочтительная высота ListView является фиксированным (произвольным) размером (я считаю, 400 пикселей). Поэтому, если вы не укажете subcontent, чтобы увеличить его, то он будет по предпочтительному размеру списка, а форсирование content будет расти, просто добавит лишнее (пустое) пространство до content: если вы не заставляете content расти, это будет принимают предпочтительный размер, который является предпочтительным размером subcontent плюс предпочтительный размер submenu.

Установка максимальной высоте не делать ничего в этом примере, как вам просто нужно, чтобы различные узлы расти за пределы их предпочтительного размера:

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

Спасибо! Ваше объяснение помогло понять, что происходит. –

 Смежные вопросы

  • Нет связанных вопросов^_^