JGraph 画出你想要的图形

  最近在学着使用开源的JGraph,为了能添加一个自己的cell,看了一堆帖子。这些帖子有一个特点,千篇一律,你转我的,我转你的,感觉太没意思了吧,始终只能画出锥形。后来还是直接搜索英文的了,搜到了The JGraph Tutorial。其中给了一个很好的例子,我略作了一些修改,功能是添加了一个自己的EllipseCell,画出了椭圆或者圆,这个取决于代码中的GraphConstants.setBounds(cells[1].getAttributes(),

new Rectangle2D.Double(140,140,40,20))。(代码中没有进行注释,想进一步了解的可以下载英

文手册进行学习,这里给出一个我上传的网址 http://download.csdn.net/source/2742630同时记得下载jar包,否则无法运行

 

 JGtest.java文件内容如下:

 import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import org.jgraph.JGraph;
import org.jgraph.graph.CellViewRenderer;
import org.jgraph.graph.DefaultCellViewFactory;
import org.jgraph.graph.DefaultEdge;
import org.jgraph.graph.DefaultGraphCell;
import org.jgraph.graph.DefaultGraphModel;
import org.jgraph.graph.DefaultPort;
import org.jgraph.graph.EdgeView;
import org.jgraph.graph.GraphConstants;
import org.jgraph.graph.GraphLayoutCache;
import org.jgraph.graph.GraphModel;
import org.jgraph.graph.VertexRenderer;
import org.jgraph.graph.VertexView;

public class JGtest {
	public static void main(String[] args)
	  {
	    GraphModel model = new DefaultGraphModel();
	    GraphLayoutCache view = new GraphLayoutCache(model, new MyView());
	    JGraph graph = new JGraph(model, view);
	    
	    DefaultGraphCell[] cells = new DefaultGraphCell[3];
            cells[0] = new EllipseCell(new String("Hello New"));
	    //GraphConstants.setAutoSize(cells[0].getAttributes(), true);
	    GraphConstants.setBounds(cells[0].getAttributes(), new Rectangle2D.Double(140,20,50,50));
	    GraphConstants.setGradientColor(cells[0].getAttributes(),Color.black);
	    GraphConstants.setOpaque(cells[0].getAttributes(), true);
	   
	    DefaultPort port0 = new DefaultPort();
	     cells[0].add(port0);
             cells[1] = new DefaultGraphCell(new String("World"));
	    GraphConstants.setBounds(cells[1].getAttributes(), new Rectangle2D.Double(140,140,40,20));
	    GraphConstants.setGradientColor(cells[1].getAttributes(),Color.red);
	    GraphConstants.setOpaque(cells[1].getAttributes(), true);
	    DefaultPort port1 = new DefaultPort();
	    cells[1].add(port1);
	    	
	    DefaultEdge edge = new DefaultEdge();
	    edge.setSource(cells[0].getChildAt(0));
	    edge.setTarget(cells[1].getChildAt(0));
	    cells[2] = edge;
	    int arrow = GraphConstants.ARROW_CLASSIC;
	    GraphConstants.setLineEnd(edge.getAttributes(), arrow);
	    GraphConstants.setEndFill(edge.getAttributes(), true);
	     graph.getGraphLayoutCache().insert(cells);

           JFrame frame = new JFrame();
	    frame.setSize(1000, 500);
	    frame.setTitle("Activity Diagram");
	    frame.getContentPane().add(new JScrollPane(graph));
	    
	     frame.setBounds(50, 50, 700, 800);
	    
	     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
	     frame.setVisible(true);
	    
	    }

}

	     

 

  EllipseCell.java文件内容:

 

 

import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Point2D;

import org.jgraph.graph.CellViewRenderer;
import org.jgraph.graph.DefaultCellViewFactory;
import org.jgraph.graph.DefaultGraphCell;
import org.jgraph.graph.EdgeView;
import org.jgraph.graph.VertexRenderer;
import org.jgraph.graph.VertexView;



//Define EllipseCell
public class EllipseCell extends DefaultGraphCell {
  // Empty Constructor
    public EllipseCell() {
      this(null);
    }
  // Construct Cell for Userobject
    public EllipseCell(Object userObject) {
    super(userObject);
     }
}

//Define the View for an EllipseCell
class EllipseView extends VertexView {
 
   static EllipseRenderer renderer = new EllipseRenderer();
 // Constructor for Superclass
   public EllipseView(Object cell) {
   super(cell);
 }
 // Returns Perimeter Point for Ellipses
   public Point2D getPerimeterPoint(EdgeView edge, Point2D source, Point2D p) {
		if (getRenderer() instanceof EllipseRenderer)
			return ((EllipseRenderer) getRenderer()).getPerimeterPoint(this,
					source, p);
		return super.getPerimeterPoint(edge, source, p);
	}
 
 // Returns the Renderer for this View
   public CellViewRenderer getRenderer() {
   return renderer;
 }
 // Define the Renderer for an EllipseView
   static class EllipseRenderer extends VertexRenderer {
    public void paint(Graphics g) { 
	 
	   try {
			if (gradientColor != null && !preview && isOpaque()) {
				setOpaque(false);
				Graphics2D g2d = (Graphics2D) g;
				 g2d.setPaint(new GradientPaint(0, 0, getBackground(),
						getWidth(), getHeight(), gradientColor, true));
				 g2d.drawOval(0, 0, getWidth(), getHeight());	 
		         g2d.fillOval(0, 0, getWidth(), getHeight());
		         
		         //System.out.println(getWidth()+" "+getHeight());
				//g2d.fillRect(0, 0, getWidth(), getHeight());
			}
			super.paint(g);
			paintSelectionBorder(g);
		} catch (IllegalArgumentException e) {
			// JDK Bug: Zero length string passed to TextLayout constructor
		}
   }
 }
}


class MyView extends DefaultCellViewFactory
{
//	Overrides JGraph.createVertexView
	protected VertexView createVertexView(Object v) {
	  // Return an EllipseView for EllipseCells
	  if (v instanceof EllipseCell)
	    return new EllipseView(v);
	  else if(v instanceof DiamondCell)
		  return new DiamondView(v);
	  // Else Call Superclass
	  return super.createVertexView(v);
	}
}



 

由于本人水平有限,目前对这个jar包还在研究中,功能很强大,呵呵。

你可能感兴趣的:(java,jdk,.net,swing)