私が取り組んでいるプロジェクトでJUNG ビジュアライゼーションの例の 1 つを使用しようとしています。
使用したいサンプルコード (JUNG 提供) は次のようになります。
package TreeVisualiser;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import javax.swing.BorderFactory;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import org.apache.commons.collections15.Factory;
import org.apache.commons.collections15.functors.ConstantTransformer;
import edu.uci.ics.jung.algorithms.layout.PolarPoint;
import edu.uci.ics.jung.algorithms.layout.RadialTreeLayout;
import edu.uci.ics.jung.algorithms.layout.TreeLayout;
import edu.uci.ics.jung.graph.DirectedGraph;
import edu.uci.ics.jung.graph.DirectedSparseMultigraph;
import edu.uci.ics.jung.graph.Forest;
import edu.uci.ics.jung.graph.DelegateForest;
import edu.uci.ics.jung.graph.DelegateTree;
import edu.uci.ics.jung.graph.Tree;
import edu.uci.ics.jung.visualization.GraphZoomScrollPane;
import edu.uci.ics.jung.visualization.Layer;
import edu.uci.ics.jung.visualization.VisualizationServer;
import edu.uci.ics.jung.visualization.VisualizationViewer;
import edu.uci.ics.jung.visualization.control.CrossoverScalingControl;
import edu.uci.ics.jung.visualization.control.DefaultModalGraphMouse;
import edu.uci.ics.jung.visualization.control.ModalGraphMouse;
import edu.uci.ics.jung.visualization.control.ScalingControl;
import edu.uci.ics.jung.visualization.decorators.EdgeShape;
import edu.uci.ics.jung.visualization.decorators.ToStringLabeller;
import edu.uci.ics.jung.visualization.layout.LayoutTransition;
import edu.uci.ics.jung.visualization.util.Animator;
/**
* Demonsrates TreeLayout and RadialTreeLayout.
* @author Tom Nelson
*
*/
@SuppressWarnings("serial")
public class TreeVisualiser extends JApplet {
Forest<String,Integer> graph;
Factory<DirectedGraph<String,Integer>> graphFactory = new Factory<DirectedGraph<String,Integer>>() {
public DirectedGraph<String, Integer> create() {
return new DirectedSparseMultigraph<String,Integer>();
}
};
Factory<Tree<String,Integer>> treeFactory = new Factory<Tree<String,Integer>> () {
public Tree<String, Integer> create() {
return new DelegateTree<String,Integer>(graphFactory);
}
};
Factory<Integer> edgeFactory = new Factory<Integer>() {
int i=0;
public Integer create() {
return i++;
}
};
Factory<String> vertexFactory = new Factory<String>() {
int i=0;
public String create() {
return "V"+i++;
}
};
/**
* the visual component and renderer for the graph
*/
VisualizationViewer<String,Integer> vv;
VisualizationServer.Paintable rings;
String root;
TreeLayout<String,Integer> treeLayout;
RadialTreeLayout<String,Integer> radialLayout;
@SuppressWarnings({ "rawtypes", "unchecked" })
public TreeVisualiser() {
// create a simple graph for the demo
graph = new DelegateForest<String,Integer>();
createTree();
treeLayout = new TreeLayout<String,Integer>(graph);
radialLayout = new RadialTreeLayout<String,Integer>(graph);
radialLayout.setSize(new Dimension(600,600));
vv = new VisualizationViewer<String,Integer>(treeLayout, new Dimension(600,600));
vv.setBackground(Color.white);
vv.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line());
vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
// add a listener for ToolTips
vv.setVertexToolTipTransformer(new ToStringLabeller());
vv.getRenderContext().setArrowFillPaintTransformer(new ConstantTransformer(Color.lightGray));
rings = new Rings();
Container content = getContentPane();
final GraphZoomScrollPane panel = new GraphZoomScrollPane(vv);
content.add(panel);
final DefaultModalGraphMouse graphMouse = new DefaultModalGraphMouse();
vv.setGraphMouse(graphMouse);
JComboBox modeBox = graphMouse.getModeComboBox();
modeBox.addItemListener(graphMouse.getModeListener());
graphMouse.setMode(ModalGraphMouse.Mode.TRANSFORMING);
final ScalingControl scaler = new CrossoverScalingControl();
JButton plus = new JButton("+");
plus.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
scaler.scale(vv, 1.1f, vv.getCenter());
}
});
JButton minus = new JButton("-");
minus.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
scaler.scale(vv, 1/1.1f, vv.getCenter());
}
});
JToggleButton radial = new JToggleButton("Radial");
radial.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent e) {
if(e.getStateChange() == ItemEvent.SELECTED) {
LayoutTransition<String,Integer> lt =
new LayoutTransition<String,Integer>(vv, treeLayout, radialLayout);
Animator animator = new Animator(lt);
animator.start();
vv.getRenderContext().getMultiLayerTransformer().setToIdentity();
vv.addPreRenderPaintable(rings);
} else {
LayoutTransition<String,Integer> lt =
new LayoutTransition<String,Integer>(vv, radialLayout, treeLayout);
Animator animator = new Animator(lt);
animator.start();
vv.getRenderContext().getMultiLayerTransformer().setToIdentity();
vv.removePreRenderPaintable(rings);
}
vv.repaint();
}});
JPanel scaleGrid = new JPanel(new GridLayout(1,0));
scaleGrid.setBorder(BorderFactory.createTitledBorder("Zoom"));
JPanel controls = new JPanel();
scaleGrid.add(plus);
scaleGrid.add(minus);
controls.add(radial);
controls.add(scaleGrid);
controls.add(modeBox);
content.add(controls, BorderLayout.SOUTH);
}
class Rings implements VisualizationServer.Paintable {
Collection<Double> depths;
public Rings() {
depths = getDepths();
}
private Collection<Double> getDepths() {
Set<Double> depths = new HashSet<Double>();
Map<String,PolarPoint> polarLocations = radialLayout.getPolarLocations();
for(String v : graph.getVertices()) {
PolarPoint pp = polarLocations.get(v);
depths.add(pp.getRadius());
}
return depths;
}
public void paint(Graphics g) {
g.setColor(Color.lightGray);
Graphics2D g2d = (Graphics2D)g;
Point2D center = radialLayout.getCenter();
Ellipse2D ellipse = new Ellipse2D.Double();
for(double d : depths) {
ellipse.setFrameFromDiagonal(center.getX()-d, center.getY()-d,
center.getX()+d, center.getY()+d);
Shape shape = vv.getRenderContext().getMultiLayerTransformer().getTransformer(Layer.LAYOUT).transform(ellipse);
g2d.draw(shape);
}
}
public boolean useTransform() {
return true;
}
}
/**
*
*/
private void createTree() {
graph.addVertex("V0");
graph.addEdge(edgeFactory.create(), "V0", "V1");
graph.addEdge(edgeFactory.create(), "V0", "V2");
graph.addEdge(edgeFactory.create(), "V1", "V4");
graph.addEdge(edgeFactory.create(), "V2", "V3");
graph.addEdge(edgeFactory.create(), "V2", "V5");
graph.addEdge(edgeFactory.create(), "V4", "V6");
graph.addEdge(edgeFactory.create(), "V4", "V7");
graph.addEdge(edgeFactory.create(), "V3", "V8");
graph.addEdge(edgeFactory.create(), "V6", "V9");
graph.addEdge(edgeFactory.create(), "V4", "V10");
graph.addVertex("A0");
graph.addEdge(edgeFactory.create(), "A0", "A1");
graph.addEdge(edgeFactory.create(), "A0", "A2");
graph.addEdge(edgeFactory.create(), "A0", "A3");
graph.addVertex("B0");
graph.addEdge(edgeFactory.create(), "B0", "B1");
graph.addEdge(edgeFactory.create(), "B0", "B2");
graph.addEdge(edgeFactory.create(), "B1", "B4");
graph.addEdge(edgeFactory.create(), "B2", "B3");
graph.addEdge(edgeFactory.create(), "B2", "B5");
graph.addEdge(edgeFactory.create(), "B4", "B6");
graph.addEdge(edgeFactory.create(), "B4", "B7");
graph.addEdge(edgeFactory.create(), "B3", "B8");
graph.addEdge(edgeFactory.create(), "B6", "B9");
}
/**
* a driver for this demo
*/
public static void main(String[] args) {
JFrame frame = new JFrame();
Container content = frame.getContentPane();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
content.add(new TreeVisualiser());
frame.pack();
frame.setVisible(true);
}
}
この例では、グラフはフレーム内に直接構築されていますが、既に構築した GUI でグラフを使用したいと考えています。このために、同じグラフをパネルに配置する必要があります。
public MainGUI(String s) {
super(s);
// Content pane
Container content = this.getContentPane();
content.setBackground(Color.lightGray);
content.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
treePanel = new JPanel();
c.fill = GridBagConstraints.HORIZONTAL;
c.ipadx = FRAMEX - 25;
c.ipady = FRAMEY - 300; //make this component tall
c.gridwidth = 3;
c.gridx = 0;
c.gridy = 1;
content.add(treePanel, c);
}
private void displayTree() {
treePanel.add(new TreeVisualiser());
}
これはグラフをまったく表示しません。JUNG ライブラリを使用した経験があり、ここで何が問題なのかを知っている人はいますか?