조직도 트리가 필요하며 모든 수준에서 노드를 축소하고 확장 할 수 있기를 원합니다. 저는 JGraphX를 처음 사용 합니다만, 접기를 구현하는 방법과 같이 꼭 읽어야 할 것은 정점을 그룹화하는 것입니다. 문제는 그룹을 만들 때 모든 자식 정점을 부모 정점 안에 배치하는 것입니다.JGraphX에서 접을 수있는 노드로 계층 적 트리를 만드는 방법
package com.mxgraph.examples.swing;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.SwingConstants;
import com.mxgraph.layout.mxCompactTreeLayout;
import com.mxgraph.layout.hierarchical.mxHierarchicalLayout;
import com.mxgraph.model.mxGeometry;
import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.util.mxConstants;
import com.mxgraph.util.mxPoint;
import com.mxgraph.util.mxRectangle;
import com.mxgraph.view.mxGraph;
import com.mxgraph.layout.hierarchical.mxHierarchicalLayout;
public class HelloWorld extends JFrame
{
/**
*
*/
private static final long serialVersionUID = -2707712944901661771L;
public HelloWorld()
{
super("Hello, puppies!");
mxGraph graph = new mxGraph();
Object parent = graph.getDefaultParent();
graph.getModel().beginUpdate();
try
{
//Notice that the parent is the default parent...
//The hierarchical structure looks great but I cannot collapse/expand the tree.
Object vDogsRoot = graph.insertVertex(parent, null, "DOG", 0, 0, 80, 30);
Object v2 = graph.insertVertex(parent, null, "Shar Pei", 0, 0, 80, 30);
Object v3 = graph.insertVertex(parent, null, "Pug", 0, 0, 80, 30);
Object v4 = graph.insertVertex(parent, null, "Cocker Spaniel", 0, 0, 80, 30);
Object v5 = graph.insertVertex(parent, null, "Pit Bull", 0, 0, 80, 30);
Object v6 = graph.insertVertex(parent, null, "Chihuahua", 0, 0, 80, 30);
graph.insertEdge(parent, null, "", vDogsRoot, v2);
graph.insertEdge(parent, null, "", vDogsRoot, v3);
graph.insertEdge(parent, null, "", vDogsRoot, v4);
graph.insertEdge(parent, null, "", vDogsRoot, v5);
graph.insertEdge(parent, null, "", vDogsRoot, v6);
mxHierarchicalLayout layout = new mxHierarchicalLayout(graph);
layout.setUseBoundingBox(false);
layout.execute(parent);
}
finally
{
graph.getModel().endUpdate();
}
mxGraphComponent graphComponent = new mxGraphComponent(graph);
getContentPane().add(graphComponent);
}
public static void main(String[] args)
{
HelloWorld frame = new HelloWorld();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 320);
frame.setVisible(true);
}
}
가 생산 :
위대한 시작하지만 축소 버튼을 여기에
은 좋은 레이아웃을 제공하지만, 폴딩을 지원하지 않는 몇 가지 예제 코드입니다. 다음 코드는 내가 가지고있는 문제를 보여줍니다. 접기를 지원하기 위해 기본 부모에서 트리의 루트 인 vDogVertex까지 정점의 부모를 변경하여 그룹을 만들려고합니다. 이것은 접을 수있게되지만 모든 자식 정점은 vDogVertex 내부에 있으며 트리 레이아웃이 망가져 있습니다.package com.mxgraph.examples.swing;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.SwingConstants;
import com.mxgraph.layout.mxCompactTreeLayout;
import com.mxgraph.layout.hierarchical.mxHierarchicalLayout;
import com.mxgraph.model.mxGeometry;
import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.util.mxConstants;
import com.mxgraph.util.mxPoint;
import com.mxgraph.util.mxRectangle;
import com.mxgraph.view.mxGraph;
import com.mxgraph.layout.hierarchical.mxHierarchicalLayout;
public class HelloWorld extends JFrame
{
/**
*
*/
private static final long serialVersionUID = -2707712944901661771L;
public HelloWorld()
{
super("Hello, puppies!");
mxGraph graph = new mxGraph();
Object parent = graph.getDefaultParent();
graph.getModel().beginUpdate();
try
{
//Notice this time the parent is the vDogsRoot vertex.
//This creates a cell group if I understand correctly.
Object vDogsRoot = graph.insertVertex(parent, null, "DOG", 0, 0, 80, 30, "");
Object v2 = graph.insertVertex(vDogsRoot, null, "Shar Pei", 0, 0, 80, 30, "");
Object v3 = graph.insertVertex(vDogsRoot, null, "Pug", 0, 0, 80, 30, "");
Object v4 = graph.insertVertex(vDogsRoot, null, "Cocker Spaniel", 0, 0, 80, 30, "");
Object v5 = graph.insertVertex(vDogsRoot, null, "Pit Bull", 0, 0, 80, 30, "");
Object v6 = graph.insertVertex(vDogsRoot, null, "Chihuahua", 0, 0, 80, 30, "");
graph.insertEdge(parent, null, "", vDogsRoot, v2);
graph.insertEdge(parent, null, "", vDogsRoot, v3);
graph.insertEdge(parent, null, "", vDogsRoot, v4);
graph.insertEdge(parent, null, "", vDogsRoot, v5);
graph.insertEdge(parent, null, "", vDogsRoot, v6);
mxHierarchicalLayout layout = new mxHierarchicalLayout(graph);
layout.setUseBoundingBox(false);
layout.execute(vDogsRoot); //apply the layout to the root group node.
layout.execute(parent);
}
finally
{
graph.getModel().endUpdate();
}
mxGraphComponent graphComponent = new mxGraphComponent(graph);
getContentPane().add(graphComponent);
}
public static void main(String[] args)
{
HelloWorld frame = new HelloWorld();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 320);
frame.setVisible(true);
}
}
는 생산 : (붕괴 버튼을 통지)
어떻게 셀 그룹의 상위 세포 내부되는 것을 정점을 방지합니까? 트리 계층 구조는 유지되지만 접을 수 있기를 원합니다. 셀 그룹을 사용하여 올바른 경로에 있습니까? 내가 뭘 잘못하고 있니?
셀 그룹의 부모에게 (vDogsRoot) 경계를 벗어난 셀을 허용해야한다고 생각하지만 아직 수행 할 방법이 없습니다. 아니면 완전히 잘못된 접근법을 취하고 있습니다. 이것을 달성하는 것은 사소한 일이어야한다고 생각하지만 나는 많은 다른 것들을 시도하고 많은 문서들을 봤지만 아직 성공하지 못했습니다.
업데이트 1 :
그룹이 내가 필요로하는 것이 아닙니다. 난 그냥 지시 트리를 탐색하고 선택한 노드 아래 노드를 표시 토글해야합니다. mxGraph 예제 폴더에 tree.html이라는 자바 스크립트 예제가 있습니다. 이 예제를 자바 스크립트에서 자바로 변환하면됩니다.