Java tutorial
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ /* * Copyright (c) 2003, the JUNG Project and the Regents of the University of * California All rights reserved. * * This software is open-source under the BSD license; see either "license.txt" * or http://jung.sourceforge.net/license.txt for a description. * */ 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.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.text.Normalizer; 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.Transformer; import org.apache.commons.collections15.functors.ConstantTransformer; import edu.uci.ics.jung.algorithms.layout.FRLayout; 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.Graph; 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.EllipseVertexShapeTransformer; import edu.uci.ics.jung.visualization.decorators.ToStringLabeller; import edu.uci.ics.jung.visualization.subLayout.TreeCollapser; /** * Demonstrates "collapsing"/"expanding" of a tree's subtrees. * * @author Tom Nelson * */ @SuppressWarnings("serial") public class TreeColapse extends JApplet { /** * the graph */ Forest<Node, Integer> graph; Factory<DirectedGraph<Node, Integer>> graphFactory = new Factory<DirectedGraph<Node, Integer>>() { public DirectedGraph<Node, Integer> create() { return new DirectedSparseMultigraph<Node, Integer>(); } }; Factory<Tree<Node, Integer>> treeFactory = new Factory<Tree<Node, Integer>>() { public Tree<Node, Integer> create() { return new DelegateTree<Node, Integer>(graphFactory); } }; Factory<Integer> edgeFactory = new Factory<Integer>() { int i = 0; public Integer create() { return i++; } }; Factory<Node> vertexFactory = new Factory<Node>() { @SuppressWarnings("unused") public Node setValFac(String nome, int nivel) { Node newNode = new Node(); newNode.setVal(nome, nivel); return newNode; } @Override public Node create() { return new Node(); } }; /** * the visual component and renderer for the graph */ VisualizationViewer<Node, Integer> vv; VisualizationServer.Paintable rings; String root; TreeLayout<Node, Integer> layout; @SuppressWarnings("unchecked") FRLayout layout1; TreeCollapser collapser; RadialTreeLayout<Node, Integer> radialLayout; @SuppressWarnings("unchecked") public TreeColapse() throws IOException { // create a simple graph for the demo graph = new DelegateForest<Node, Integer>(); createTree(); layout = new TreeLayout<Node, Integer>(graph); collapser = new TreeCollapser(); radialLayout = new RadialTreeLayout<Node, Integer>(graph); radialLayout.setSize(new Dimension(600, 600)); vv = new VisualizationViewer<Node, Integer>(layout, new Dimension(600, 600)); vv.setBackground(Color.white); vv.getRenderContext().setEdgeShapeTransformer(new EdgeShape.Line()); //vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller<Node>()); vv.getRenderContext().setVertexLabelTransformer(new Transformer<Node, String>() { public String transform(Node e) { return (e.getName()); } }); vv.getRenderContext().setVertexShapeTransformer(new ClusterVertexShapeFunction()); // 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) { // layout.setRadial(true); vv.setGraphLayout(radialLayout); vv.getRenderContext().getMultiLayerTransformer().setToIdentity(); vv.addPreRenderPaintable(rings); } else { // layout.setRadial(false); vv.setGraphLayout(layout); vv.getRenderContext().getMultiLayerTransformer().setToIdentity(); vv.removePreRenderPaintable(rings); } vv.repaint(); } }); JButton collapse = new JButton("Collapse"); collapse.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Collection picked = new HashSet(vv.getPickedVertexState().getPicked()); if (picked.size() == 1) { Object root = picked.iterator().next(); Forest inGraph = (Forest) layout.getGraph(); try { collapser.collapse(vv.getGraphLayout(), inGraph, root); } catch (InstantiationException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IllegalAccessException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } vv.getPickedVertexState().clear(); vv.repaint(); } } }); JButton expand = new JButton("Expand"); expand.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { Collection picked = vv.getPickedVertexState().getPicked(); for (Object v : picked) { if (v instanceof Forest) { Forest inGraph = (Forest) layout.getGraph(); collapser.expand(inGraph, (Forest) v); } vv.getPickedVertexState().clear(); 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); controls.add(collapse); controls.add(expand); 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<Node, PolarPoint> polarLocations = radialLayout.getPolarLocations(); for (Node 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; } } /** * @throws IOException * */ private void createTree() throws IOException { int nivelTree = 0; FileReader txtFile = new FileReader( "C:/Users/Vinicius/Desktop/fantinatto/academico/TCC/alg/dataminingSE/taxonomia_materias.txt"); BufferedReader txtBuffer = new BufferedReader(txtFile); String curLine = txtBuffer.readLine(); Node root = new Node(); root.setVal("Root", 0); graph.addVertex(root); Node aux = root; while (curLine != null) { String minusculo = curLine.toLowerCase(); // normaliza em minusculo // e sem acento minusculo = Normalizer.normalize(minusculo, Normalizer.Form.NFD); minusculo = minusculo.replaceAll("[^\\p{ASCII}]", ""); String[] linhaSplit = minusculo.split("\t"); // tamanho do indice nivelTree = linhaSplit[0].length(); // encontra pai para o novo n while (nivelTree <= aux.getNivel()) { // pega n pai, se for root retorna null if (graph.getParent(aux) != null) { aux = graph.getParent(aux); } } if (nivelTree == aux.getNivel()) { Node newNode = new Node(); newNode.setVal(linhaSplit[1], nivelTree); graph.addEdge(edgeFactory.create(), graph.getParent(aux), newNode); aux = graph.getParent(newNode); } else { Node newNode = new Node(); newNode.setVal(linhaSplit[1], nivelTree); graph.addEdge(edgeFactory.create(), aux, newNode); aux = newNode; } curLine = txtBuffer.readLine(); } } /** * a demo class that will create a vertex shape that is either a polygon or * star. The number of sides corresponds to the number of vertices that were * collapsed into the vertex represented by this shape. * * @author Tom Nelson * * @param <V> */ class ClusterVertexShapeFunction<V> extends EllipseVertexShapeTransformer<V> { ClusterVertexShapeFunction() { setSizeTransformer(new ClusterVertexSizeFunction<V>(20)); } @SuppressWarnings("unchecked") @Override public Shape transform(V v) { if (v instanceof Graph) { int size = ((Graph) v).getVertexCount(); if (size < 8) { int sides = Math.max(size, 3); return factory.getRegularPolygon(v, sides); } else { return factory.getRegularStar(v, size); } } return super.transform(v); } } /** * A demo class that will make vertices larger if they represent a collapsed * collection of original vertices * * @author Tom Nelson * * @param <V> */ class ClusterVertexSizeFunction<V> implements Transformer<V, Integer> { int size; public ClusterVertexSizeFunction(Integer size) { this.size = size; } public Integer transform(V v) { if (v instanceof Graph) { return 30; } return size; } } /** * a driver for this demo * * @throws IOException */ public static void main(String[] args) throws IOException { JFrame frame = new JFrame(); Container content = frame.getContentPane(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); content.add(new TreeColapse()); frame.pack(); frame.setVisible(true); } }