#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. Это работает! Это именно то, что я искал, спасибо!