# TreeView automatisch an große von Inhalt anpassen



## pr (18. Feb 2017)

Hallo,
ich habe mehrere einzelne TreeView-Controls in einer VBox.
Wie bekomme ich hin, dass sich die Größe des TreeView automatisch an seinen Inhalt anpasst?

Es handelt sich um exakt dieses Poblem: http://stackoverflow.com/questions/17381055/javafx-tree-view-height-according-to-content

(Ich bin nicht der Autor dieses Threads; es ist nur exakt meine Frage.)

Danke euch... vielleicht gibt's ja eine einfache Lösung.


----------



## knilch (19. Feb 2017)

Hi,
Bei der TreeView sollte die Grösse eigentilich automatisch angepasst werden.
Vielleicht wäre hilfreich, wenn du uns den Code postest, in dem die Parent- und Child-Nodes erstellst und diese dann in die TreeView einfügst. Sonst können wir nur raten wo das Problem liegt...


----------



## pr (22. Feb 2017)

knilch hat gesagt.:


> Hi,
> Bei der TreeView sollte die Grösse eigentilich automatisch angepasst werden.
> Vielleicht wäre hilfreich, wenn du uns den Code postest, in dem die Parent- und Child-Nodes erstellst und diese dann in die TreeView einfügst. Sonst können wir nur raten wo das Problem liegt...



Hier kommt der Code. Wahrscheinlich ist es ganz anfängerhaft von mir, dass ich nicht weiß, wieso es nicht geht. Danke für deine Hilfe. Dass überflüssige Imports drin sind weiß ich, wollte sie aber jetzt  nicht blind löschen. Ich erzeuge in dem Code nur 1 Tree-Control. In der Anwendung erzeuge ich am Ende aber mehrere, weil jedes Control einen Database-Record darstellt.


```
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.TextArea;
import javafx.scene.control.TreeView;
import javafx.geometry.Insets;
import javafx.scene.layout.VBox;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Region.*;
import javafx.scene.layout.FlowPane;
import javafx.scene.control.ScrollPane;
import javafx.geometry.Orientation;
import javafx.stage.Stage;
import javafx.scene.control.TreeItem;
import javafx.scene.layout.Priority;

class CustomTreeItem extends HBox {

    public CustomTreeItem(String name) {

        TextArea text_area = new TextArea();
        Label label = new Label(name);

        text_area.setPrefWidth(230);
        text_area.setPrefHeight(80);
        this.getChildren().addAll(label, text_area);
    }
}




class CustomTree extends TreeView {

    public CustomTree() {

        //TreeView<Field> tree = new TreeView<Field>();

        TreeItem<CustomTreeItem> root = new TreeItem<CustomTreeItem>(new CustomTreeItem("A"));
        this.setRoot(root);

        TreeItem<CustomTreeItem> child = new TreeItem<CustomTreeItem>(new CustomTreeItem("B"));

        root.getChildren().add( child );

        root.setExpanded(true);

        this.setPrefWidth(400);
    }

}


public class TreeTest extends Application {

    public static void main(String[] args) {
        launch(args);
    }
 
    @Override
    public void start(Stage primaryStage) {

    CustomTree tree1 = new CustomTree();

    VBox box = new VBox();
    box.getChildren().addAll(tree1);

    ScrollPane root = new ScrollPane();
    root.setContent(box);

        primaryStage.setScene(new Scene(root, 600, 400));
        primaryStage.show();
    }
}
```

Präzisierung meiner Frage : Wie bekomme ich hin, dass sich die Child-Nodes des VBox-Containers nicht nach der Größe der VBox richten? Gibt es einen Container, der für mein Vorhaben besser geeignet ist ? Ich habe schon erfolglos das FlowPane versucht.


----------



## dzim (22. Feb 2017)

Children in _VBox_ nutzen nur dann den verfügbaren Platz, wenn man es ihnen sagt (und/oder die min/max height entsprechend setzt) -> *VBox.setVGrow(Node, Priority)*
Das Grundsätzliche Problem jedoch ist, dass jedes Layout die Grösse des _*TreeViews*_ nutzen wird. Dessen Grösse richtet sich aber **nicht** nach seinen Child-Nodes... Das heisst, du musst eigentlich irgendwie die Gesamthöhe der Children addieren, plus den Platz zwischen den Children und musst dann - unter Beachtung von eventuellen Borders des _TreeViews_ dessen min und maxHeight auf den errechneten Wert setzen. Ansonsten wird es, meines Wissens nach, nicht möglich sein es zu erreichen.
Am Besten wirst du dir wohl ein eigenes Layout (also von Pane ableiten) dafür schreiben, was sich um so etwas kümmern kann...

(Ich hoffe, ich habe halbwegs verständlich gemacht, was ich meine... Sonst: Fragen!)


----------

