Как вставить несколько разных объектов (классов) в представление дерева с помощью JavaFX

#java #javafx #treeview

#java #javafx #представление дерева

Вопрос:

Я пытаюсь создать TableView, в котором для каждого уровня существуют разные классы / типы объектов. Мой TreeView будет выглядеть примерно так, где объект A.1 будет первым экземпляром класса A, объект A.2 вторым и т.д..

 >RootItem
    >Object A.1
        >Object B.1
        >Object B.2
        >Object C.1
    >Object A.2
        >Object B.3
            >Object D.1
  

Мне нужно только отобразить имя объектов (т. Е. Метод toString), но мне также нужно, чтобы объекты были не просто строками, чтобы я мог получить доступ к другим атрибутам позже (т.Е. Если пользователь дважды щелкнет по объекту).

Как это должно быть реализовано? Может быть, есть другой подход, о котором я не подумал?

Комментарии:

1. Почему бы вам не создать класс с вышеуказанной структурой, A имеет List<B> amp; List<C>, а B имеет List<D> также, если вы опубликуете код ur, который вы пробовали до сих пор, это поможет вам получить лучшее решение.

2. Ваш подход мне нравится. У вас возникли проблемы с этим?

3. Я опубликовал ответ, это то, что вы хотели?

4. Спасибо за предложение, я попробовал ваш подход. Я создал представление дерева <A>, где A имеет List<B> и List<C>, а B имеет List<D> . Проблема в том, что я не могу поместить элементы List<B> , List<C> и т.д. в представление дерева, потому что они не относятся к типу <A> . Единственным вариантом было создать представление дерева из типа <String>, а затем вручную применить для каждого элемента метод toString, что-то вроде этого: for(Object o : List<A>) TreeView.add(o.toString) И это для каждого списка. Проблема с этим заключается в том, что в TreeView у меня есть только строки, а не сами объекты. Я опубликую свой код позже сегодня 🙂

5. Извините за плохой формат, я здесь вроде как новичок. Где я должен публиковать ответы, которые длиннее? (это не позволило бы мне написать больше символов)

Ответ №1:

 import java.io.IOException;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class SOTest extends Application{

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

    @Override
    public void start(Stage stage) throws Exception {
        //Creating tree items
        TreeItem<Parent> root1 = new TreeItem<Parent>(new A("A.1"));
        TreeItem<Parent> item1 = new TreeItem<Parent>(new B("B.1"));
        TreeItem<Parent> item2 = new TreeItem<Parent>(new B("B.2"));
        TreeItem<Parent> item3 = new TreeItem<Parent>(new C("C.1"));
        root1.setExpanded(true);
        root1.getChildren().addAll(item1, item2, item3);
        
        
        TreeItem<Parent> root2 = new TreeItem<Parent>(new A("A.2"));
        item1 = new TreeItem<Parent>(new B("B.3"));
        TreeItem<Parent> subItem = new TreeItem<Parent>(new D("D.1"));
        item1.getChildren().add(subItem);
        root2.getChildren().addAll(item1);

        
        TreeItem base = new TreeItem("Root Node");
        base.setExpanded(true);
        base.getChildren().addAll(root1, root2);
        //Creating a TreeView item
        TreeView view = new TreeView(base);
        view.setPrefHeight(300);
        VBox pane = new VBox(10);
        pane.setPadding(new Insets(5, 5, 5, 50));
        pane.getChildren().addAll(view);
        //Setting the stage
        Group node = new Group(pane);
        Scene scene = new Scene(node, 595, 320);
        stage.setTitle("Diff Object Tree Structure");
        stage.setScene(scene);
        stage.show();
    }
}

abstract class Parent{
    protected String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    public String toString() {
        return name;
    }
}

class A extends Parent{
    public A(String name) {
        this.name = name;
    }
    public B b;
    public C c;
}

class B extends Parent{
    public B(String name) {
        this.name = name;
    }
    public D d;
}

class C extends Parent{
    public C(String name) {
        this.name = name;
    }
}

class D extends Parent{
    public D(String name) {
        this.name = name;
    }
}
  

введите описание изображения здесь

Комментарии:

1. Спасибо за ваш ответ, я попробую его позже сегодня и свяжусь с вами!

2. Это работает! Это именно то, что я искал, спасибо!