TreeView automatisch an große von Inhalt anpassen

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...
 
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.

Java:
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.
 
Zuletzt bearbeitet:
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!)
 

Zurück
Oben