`

prefuse实例+注释+调色板装饰初始化节点类别颜色(原创)

阅读更多
自己摸索了几天,搞了这么点注释,大家帮忙看看有神马不对的,请不吝赐教
package prefuse;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.MouseEvent;
import java.util.Iterator;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

import prefuse.Constants;
import prefuse.Display;
import prefuse.Visualization;
import prefuse.action.ActionList;
import prefuse.action.GroupAction;
import prefuse.action.ItemAction;
import prefuse.action.RepaintAction;
import prefuse.action.animate.ColorAnimator;
import prefuse.action.animate.PolarLocationAnimator;
import prefuse.action.animate.QualityControlAnimator;
import prefuse.action.animate.VisibilityAnimator;
import prefuse.action.assignment.ColorAction;
import prefuse.action.assignment.DataColorAction;
import prefuse.action.assignment.FontAction;
import prefuse.action.layout.CollapsedSubtreeLayout;
import prefuse.action.layout.graph.RadialTreeLayout;
import prefuse.activity.SlowInSlowOutPacer;
import prefuse.controls.ControlAdapter;
import prefuse.controls.DragControl;
import prefuse.controls.FocusControl;
import prefuse.controls.HoverActionControl;
import prefuse.controls.PanControl;
import prefuse.controls.WheelZoomControl;
import prefuse.controls.ZoomControl;
import prefuse.controls.ZoomToFitControl;
import prefuse.controls.ZoomingPanControl;
import prefuse.data.Graph;
import prefuse.data.Node;
import prefuse.data.Table;
import prefuse.data.Tuple;
import prefuse.data.event.TupleSetListener;
import prefuse.data.io.GraphMLReader;
import prefuse.data.query.SearchQueryBinding;
import prefuse.data.search.PrefixSearchTupleSet;
import prefuse.data.search.SearchTupleSet;
import prefuse.data.tuple.DefaultTupleSet;
import prefuse.data.tuple.TupleSet;
import prefuse.render.AbstractShapeRenderer;
import prefuse.render.DefaultRendererFactory;
import prefuse.render.EdgeRenderer;
import prefuse.render.LabelRenderer;
import prefuse.util.ColorLib;
import prefuse.util.FontLib;
import prefuse.util.ui.JFastLabel;
import prefuse.util.ui.JSearchPanel;
import prefuse.util.ui.UILib;
import prefuse.visual.NodeItem;
import prefuse.visual.VisualItem;
import prefuse.visual.expression.InGroupPredicate;
import prefuse.visual.sort.TreeDepthItemSorter;

/**
 * Demonstration of a node-link tree viewer
 * @author lee   http://faithlee.iteye.com
 * @version 1.0
 */
public class CopyOfTest extends Display {

	public static final String DATA_FILE = "project.xml";

	private static final String tree = "tree";
	private static final String treeNodes = "tree.nodes";
	private static final String treeEdges = "tree.edges";
	private static final String linear = "linear";

	private LabelRenderer m_nodeRenderer;
	private EdgeRenderer m_edgeRenderer;

	private String m_label = "label";
	private String m_sex = "sex";

	public CopyOfTest(Graph g, String label, String sex) {
		super(new Visualization());
		m_label = label;

		m_sex = sex;
		// -- set up visualization --
		m_vis.add(tree, g);
		m_vis.setInteractive(treeEdges, null, false);

		// --  设置渲染器 --
		m_nodeRenderer = new LabelRenderer(m_label); // 使用label来创建带有标签的节点
		m_nodeRenderer.setRenderType(AbstractShapeRenderer.RENDER_TYPE_FILL);
		m_nodeRenderer.setHorizontalAlignment(Constants.CENTER);
		m_nodeRenderer.setRoundedCorner(8, 8);// 标签为平滑的边缘
		m_edgeRenderer = new EdgeRenderer();

		DefaultRendererFactory rf = new DefaultRendererFactory(m_nodeRenderer);// 决定图形怎么画的主要工具
		rf.add(new InGroupPredicate(treeEdges), m_edgeRenderer);
		m_vis.setRendererFactory(rf);

		// -- 设置节点颜色,字体大小、颜色 --
		ItemAction edgeColor = new ColorAction(treeEdges,
				VisualItem.STROKECOLOR, ColorLib.rgb(200, 200, 200));

		FontAction fonts = new FontAction(treeNodes, FontLib.getFont("宋体&新宋体",
				10));
		fonts.add("ingroup('_focus_')", FontLib.getFont("宋体&新宋体", 11));

		// 创建调色板,颜色对应配置文件中相应属性的字母顺序
		int[] palette = new int[] { ColorLib.rgb(128, 128, 255),
				ColorLib.rgb(255, 128, 192), ColorLib.rgb(255, 140, 85) };
		// 文件不同类别的数据值,根据调色板使用不同颜色
		DataColorAction fill = new DataColorAction("tree.nodes", "gender",
				Constants.NOMINAL, VisualItem.FILLCOLOR, palette);
		// use black for node text
		fill.add("_hover", ColorLib.gray(220, 230));
		fill.add("ingroup('_search_')", ColorLib.rgb(255, 190, 190));
		fill.add("ingroup('_focus_')", ColorLib.rgb(198, 229, 229));

		ColorAction text = new ColorAction("tree.nodes", VisualItem.TEXTCOLOR,
				ColorLib.gray(0));

		text.add("_hover", ColorLib.rgb(255, 0, 0));
		// use light grey for edges
		ColorAction edges = new ColorAction("tree.nodes",
				VisualItem.STROKECOLOR, ColorLib.gray(200));

		// create an action list containing all color assignments
		ActionList color = new ActionList();
		color.add(fill);
		color.add(text);
		color.add(edges);
		m_vis.putAction("color", color);

		// recolor
		ActionList recolor = new ActionList();
		recolor.add(fill);
		m_vis.putAction("recolor", recolor);

		// repaint
		ActionList repaint = new ActionList();
		repaint.add(recolor);
		repaint.add(new RepaintAction());
		m_vis.putAction("repaint", repaint);

		// animate paint change
		ActionList animatePaint = new ActionList(400);
		animatePaint.add(new ColorAnimator(treeNodes));
		animatePaint.add(new RepaintAction());

		m_vis.putAction("animatePaint", animatePaint);

		// create the tree layout action
		RadialTreeLayout treeLayout = new RadialTreeLayout(tree);

		// treeLayout.setLayoutRoot() // 可以设置初始中心点
		// treeLayout.setAngularBounds(-Math.PI/2, Math.PI);
		m_vis.putAction("treeLayout", treeLayout);
		CollapsedSubtreeLayout subLayout = new CollapsedSubtreeLayout(tree);

		m_vis.putAction("subLayout", subLayout);
		// create the filtering and layout
		ActionList filter = new ActionList();

		filter.add(new TreeRootAction(tree));
		filter.add(fonts);
		filter.add(treeLayout);
		filter.add(subLayout);
		filter.add(fill);
		filter.add(edgeColor);
		m_vis.putAction("filter", filter);

		// animated transition 动画过渡
		ActionList animate = new ActionList(1250);// 活动时间
		animate.setPacingFunction(new SlowInSlowOutPacer());
		animate.add(new QualityControlAnimator());
		animate.add(new VisibilityAnimator(tree));
		animate.add(new PolarLocationAnimator(treeNodes, linear));
		animate.add(new ColorAnimator(treeNodes));
		animate.add(new RepaintAction());
		m_vis.putAction("animate", animate);
		m_vis.alwaysRunAfter("filter", "animate");

		// ------------------------------------------------
		// initialize the display
		setSize(700, 600);// 初始化jframe大小
		setItemSorter(new TreeDepthItemSorter());

		// 添加对一系列鼠标事件的监听
		addControlListener(new WheelZoomControl());// 鼠标滚轮放大缩小效果
		// addControlListener(new NeighborHighlightControl()); //相邻节点加亮监听
		addControlListener(new DragControl());
		addControlListener(new ZoomToFitControl());// 右键单击使画面最适合状态
		// addControlListener(new ZoomControl());//右键移动改变图像大小
		addControlListener(new PanControl());
		addControlListener(new FocusControl(1, "filter"));// 设置鼠标点击次数改变节点中心
		addControlListener(new HoverActionControl("repaint"));

		// ------------------------------------------------

		// filter graph and perform layout
		m_vis.run("filter");

		// maintain a set of items that should be interpolated linearly
		// this isn't absolutely necessary, but makes the animations nicer
		// the PolarLocationAnimator should read this set and act accordingly
		m_vis.addFocusGroup(linear, new DefaultTupleSet());
		m_vis.getGroup(Visualization.FOCUS_ITEMS).addTupleSetListener(
				new TupleSetListener() {
					public void tupleSetChanged(TupleSet t, Tuple[] add,
							Tuple[] rem) {
						TupleSet linearInterp = m_vis.getGroup(linear);
						if (add.length < 1)
							return;
						linearInterp.clear();
						for (Node n = (Node) add[0]; n != null; n = n
								.getParent())
							linearInterp.addTuple(n);
					}
				});

		SearchTupleSet search = new PrefixSearchTupleSet();
		m_vis.addFocusGroup(Visualization.SEARCH_ITEMS, search);
		search.addTupleSetListener(new TupleSetListener() {
			public void tupleSetChanged(TupleSet t, Tuple[] add, Tuple[] rem) {
				m_vis.cancel("animatePaint");
				m_vis.run("recolor");
				m_vis.run("animatePaint");
			}
		});
	}

	// ------------------------------------------------------------------------

	public static void main(String argv[]) {
		String infile = DATA_FILE;
		String label = "name";
		String sex = "gender";

		if (argv.length > 1) {
			infile = argv[0];
			label = argv[1];
			sex = argv[2];
		}
		UILib.setPlatformLookAndFeel();// 适合当前系统平台。

		JFrame frame = new JFrame("关系图");

		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// frame.setContentPane(demo(infile, label));
		// JPanel jpanel = demo(infile,label);
		frame.getContentPane().add(demo(infile, label, sex),
				BorderLayout.CENTER);
		frame.pack();
		frame.setVisible(true);
		frame.setLocationRelativeTo(null); // 当参数为null时窗体处于屏幕正中
	}

	public static JPanel demo() {
		return demo(DATA_FILE, "name", "gender");
	}

	public static JPanel demo(String datafile, final String label,
			final String sex) {
		Graph g = null;
		try {
			g = new GraphMLReader().readGraph(datafile);
		} catch (Exception e) {
			e.printStackTrace();
			System.exit(1);
		}
		return demo(g, label, sex);
	}

	public static JPanel demo(Graph g, final String label, final String sex) {

		// create a new radial tree view
		final CopyOfTest gview = new CopyOfTest(g, label, sex);

		Visualization vis = gview.getVisualization();
		// create a search panel for the tree map
		SearchQueryBinding sq = new SearchQueryBinding((Table) vis
				.getGroup(treeNodes), label, (SearchTupleSet) vis
				.getGroup(Visualization.SEARCH_ITEMS));
		JSearchPanel search = sq.createSearchPanel();
		search.setShowResultCount(true);
		search.setBorder(BorderFactory.createEmptyBorder(5, 5, 4, 0));
		search.setFont(FontLib.getFont("宋体&新宋体", Font.PLAIN, 12));

		final JFastLabel title = new JFastLabel("");
		title.setPreferredSize(new Dimension(25, 20));
		title.setVerticalAlignment(SwingConstants.BOTTOM);
		title.setBorder(BorderFactory.createEmptyBorder(3, 0, 0, 0));
		title.setFont(FontLib.getFont("宋体&新宋体", Font.PLAIN, 12));

		gview.addControlListener(new ControlAdapter() {
			public void itemEntered(VisualItem item, MouseEvent e) {
				if (item.canGetString(label))
					title.setText(item.getString(label));
			}

			public void itemExited(VisualItem item, MouseEvent e) {
				title.setText(null);
			}
		});

		Box box = new Box(BoxLayout.X_AXIS);
		box.add(Box.createHorizontalStrut(10));
		box.add(title);
		box.add(Box.createHorizontalGlue());
		box.add(search);
		box.add(Box.createHorizontalStrut(3));

		JPanel panel = new JPanel(new BorderLayout());
		panel.add(gview, BorderLayout.CENTER);
		panel.add(box, BorderLayout.SOUTH);

		Color BACKGROUND = Color.WHITE;
		Color FOREGROUND = Color.DARK_GRAY;
		UILib.setColor(panel, BACKGROUND, FOREGROUND);

		return panel;
	}

	// ------------------------------------------------------------------------

	/**
	 * Switch the root of the tree by requesting a new spanning tree at the
	 * desired root
	 */
	public static class TreeRootAction extends GroupAction {
		public TreeRootAction(String graphGroup) {
			super(graphGroup);
		}

		public void run(double frac) {
			TupleSet focus = m_vis.getGroup(Visualization.FOCUS_ITEMS);
			if (focus == null || focus.getTupleCount() == 0)
				return;

			Graph g = (Graph) m_vis.getGroup(m_group);
			Node f = null;
			Iterator tuples = focus.tuples();
			while (tuples.hasNext()
					&& !g.containsTuple(f = (Node) tuples.next())) {
				f = null;
			}
			if (f == null)
				return;
			g.getSpanningTree(f);
		}
	}
} 


xml文件 涉及一些数据问题,不贴了,大概编写一下格式
<?xml version="1.0" encoding="GB2312"?>
	<!--  An excerpt of an egocentric social network  -->
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
	<graph edgedefault="undirected">

		<!-- data schema -->
		<key id="name" for="node" attr.name="name" attr.type="string" />
		<key id="gender" for="node" attr.name="gender" attr.type="string" />

		<!-- nodes -->
		<node id="1">
			<data key="name">张三</data>
			<data key="gender">H</data>
		</node>
                <node id="2">
			<data key="name">王二</data>
			<data key="gender">H</data>
		</node>
          
		//此处省略。。。



         
		<node id="107">
			<data key="name">D:资源部</data>
			<data key="gender">D</data>
		</node>
		<node id="108">
			<data key="name">D:发展部</data>
			<data key="gender">D</data>
		</node>
                //此处省略N多。。



		<node id="s1">
			<data key="name">P:管理安全</data>
			<data key="gender">P</data>
		</node>
		//此处省略




             
             <edge source="1" target="s1"></edge>
             <edge source="1" target="100"></edge>
             <edge source="1" target="s2"></edge>
	     <edge source="1" target="s3"></edge>


             <edge source="2" target="s1"></edge>
             <edge source="2" target="101"></edge>
             <edge source="2" target="s2"></edge> 
	     <edge source="2" target="s3"></edge>
	     <edge source="2" target="s7"></edge>
	     <edge source="2" target="s8"></edge>
	     <edge source="2" target="s9"></edge>
 	     <edge source="2" target="s13"></edge>



             <edge source="3" target="102"></edge>
             <edge source="3" target="s1"></edge>


             <edge source="4" target="103"></edge>
             <edge source="4" target="s1"></edge>

	     <edge source="5" target="s2"></edge>
             <edge source="5" target="100"></edge>


             <edge source="6" target="s2"></edge>
             <edge source="6" target="101"></edge>

             <edge source="7" target="s3"></edge>
	     <edge source="7" target="s7"></edge>
             <edge source="7" target="104"></edge>
             
             <edge source="8" target="105"></edge>
 	     <edge source="8" target="s4"></edge>            	     
             <edge source="8" target="s15"></edge>
	     <edge source="8" target="s16"></edge>

	     <edge source="9" target="100"></edge>
             <edge source="9" target="s5"></edge>

	     <edge source="10" target="104"></edge>
             <edge source="10" target="s5"></edge>


             <edge source="11" target="100"></edge>
             <edge source="11" target="s6"></edge>

	     <edge source="12" target="106"></edge>
             <edge source="12" target="s6"></edge>	

            
	     <edge source="13" target="100"></edge>
             <edge source="13" target="s7"></edge>

 	    <edge source="14" target="s8"></edge>
            <edge source="14" target="s9"></edge> 
	    <edge source="14" target="s10"></edge>
            <edge source="14" target="s11"></edge> 
	    <edge source="14" target="s12"></edge>
            <edge source="14" target="s13"></edge>
	    <edge source="14" target="100"></edge>

	    <edge source="15" target="108"></edge>
            <edge source="15" target="s12"></edge>
	    <edge source="15" target="s14"></edge>

 	    <edge source="16" target="s14"></edge> 
	    <edge source="16" target="s15"></edge>
            <edge source="16" target="s16"></edge>
	    <edge source="16" target="100"></edge>

	    <edge source="17" target="s11"></edge>
	    <edge source="17" target="107"></edge>	  




	 
</graph>
</graphml>


至于完成后的图像 等我改过数据后再贴。。。。
转载请标出处,前段在网上搜不到相关资料,我自己摸索出来点东西贴上来吧,过了没两周,网上铺天盖地的全是那篇文章。。哎,这样太浪费那些急于找相关资料人的时间了。
1
0
分享到:
评论
7 楼 菜鸟级JAVA 2012-12-03  
ljjclub 写道
xandria 写道
你好,我在eclipse上运行了你给的上述实例,可是节点的标签上未显示节点的内容,这是怎么回事呢?请楼主赐教啊。

xandria 写道
你好,我在eclipse上运行了你给的上述实例,可是节点的标签上未显示节点的内容,这是怎么回事呢?请楼主赐教啊。

不会啊,绝对是可以运行的

你看这些地方是不是有问题:1.xml配置文件路径,2。prefuse包

还有报什么异常没有

节点上真没有显示,只有鼠标放到节点上的时候,左下角显示了  节点上没有任何信息显示,楼主为何
6 楼 菜鸟级JAVA 2012-11-14  
你好,请问一下用prefuse的Graph展示关系图,如何做到最开始是一个id节点,鼠标点击之后再把相关联的数据节点显示出来,现在只能鼠标节点system输出信息,如何实现增加节点显示的功能,谢谢!
5 楼 xidianluke 2012-06-13  
ItemAction textColor = new TextColorAction(treeNodes);
//设置图中节点名称
recolor.add(textColor);
增加这两个东西,就能显示节点内容了
4 楼 ljjclub 2012-06-08  
commanderhyk 写道
你好,提一个问题.prefuse能否做多组图的展示.
我修改了一下xml,如(a,b,c,d,e)是一组关联  (x,y,z)是另一组.发现在渲染的时候,总是一组在中央显示,而另一组却聚集在一个点.如何修改代码让着两组都能正确布局,谢谢


可以。理清节点间的对应关系,参照prefuse的api根据需要修改布局对象
3 楼 commanderhyk 2012-06-07  
你好,提一个问题.prefuse能否做多组图的展示.
我修改了一下xml,如(a,b,c,d,e)是一组关联  (x,y,z)是另一组.发现在渲染的时候,总是一组在中央显示,而另一组却聚集在一个点.如何修改代码让着两组都能正确布局,谢谢
2 楼 ljjclub 2012-05-21  
xandria 写道
你好,我在eclipse上运行了你给的上述实例,可是节点的标签上未显示节点的内容,这是怎么回事呢?请楼主赐教啊。

xandria 写道
你好,我在eclipse上运行了你给的上述实例,可是节点的标签上未显示节点的内容,这是怎么回事呢?请楼主赐教啊。

不会啊,绝对是可以运行的

你看这些地方是不是有问题:1.xml配置文件路径,2。prefuse包

还有报什么异常没有
1 楼 xandria 2012-05-13  
你好,我在eclipse上运行了你给的上述实例,可是节点的标签上未显示节点的内容,这是怎么回事呢?请楼主赐教啊。

相关推荐

    prefuse源码 初解 prefuse的英文文档

    Prefuse是一个强大的图形编程框架,主要用于数据可视化。它是由Java编写,提供了丰富的工具和库,使得开发者能够构建交互式、动态的数据展示应用。这个“prefuse源码 初解 prefuse的英文文档”可能包含对Prefuse框架...

    Prefuse-master.zip

    这些示例展示了如何使用Prefuse构建不同类型的可视化,并提供了详细的代码注释和说明。 7. **扩展性**:Prefuse 的模块化设计使得开发者能够轻松地添加新的数据类型、布局算法或视觉效果,从而扩展框架的功能。 8....

    prefuse图形化软件包源码

    prefuse是数据图形化展示应用编程的不二选择,利用prefuse,你可以将抽象的数据表示为图形、动画、网表等直观的形式,目前在svn数据挖掘和研究中极为有效,使用prefuse制作的比较好的产品有veszter和sna等

    prefuse 初解

    4. **Actions and Transitions**: 动作(Actions)是Prefuse中一种重要的概念,它们用于描述可视化过程中的一系列变化,如颜色变换、大小调整等。过渡(Transitions)则是指动作执行的过程,可以通过设置动画效果来...

    prefuse-beta版工具包

    Prefuse是一款强大的开源Java库,专门用于数据可视化。它的全称是“Prefuse Visual Toolkit”,在数据可视化的领域中有着广泛的应用。这个“prefuse-beta版工具包”提供了 Prefuse 的一个早期版本,可能包含了该工具...

    prefuse树形菜单

    "Prefuse树形菜单"是一种基于Prefuse库的Java Applet程序开发技术,主要用于构建具有动态视觉效果的交互式树状数据结构展示。Prefuse是一个强大的可视化工具包,由Java编写,它为创建复杂的、数据驱动的用户界面提供...

    prefuse初解

    ### Prefuse初解 #### 一、Prefuse简介与应用场景 Prefuse是一个强大的开源Java库,主要用于实现数据可视化。它可以广泛应用于商业和非商业场景,为用户提供了一个灵活且高效的工具来展示复杂的数据集。相较于传统...

    prefuse的简单教程

    Prefuse 是一个强大的 Java 库,专为数据可视化设计,尤其适合绘制社交网络关系图。它提供了一套灵活的框架,能够将结构化和非结构化的数据转化为交互式的视觉展示。 Prefuse 支持多种类型的数据,包括层次结构(如...

    the prefuse visualization toolkit

    《Prefuse Visualization Toolkit:强大的数据可视化工具》 Prefuse Visualization Toolkit(PVT)是一个开源的Java库,专门用于创建交互式的数据可视化应用。这个工具包为开发者提供了丰富的功能,能够帮助他们将...

    prefuse软件框架

    Prefuse 是一个可扩展的软件框架,它可以帮助使用...Prefuse的目标是1简化处理数据过程的开发,2建立数据和显示的图形的联系(特别是图形的大小,位置,形状,颜色),3建立交互的可视化数据显示,prefuse有如下的特征:

    prefuse.rar

    Prefuse是一款强大的Java图形可视化库,它为开发者提供了一种灵活且高效的方式来创建各种复杂的图形界面,包括但不限于网络图、树图、表格以及各种自定义的视觉表示。这个rar压缩包包含了Prefuse的核心组件和相关...

    prefuse作者写的一篇关于prefuse的介绍文章

    5. **灵活性与可适应性**:通过一系列应用实例展示,Prefuse证明了其强大的灵活性和适应性。即使对于非专业人员来说,也能够快速地构建有用的交互式可视化。 #### 三、关键技术与功能 - **Node-Link Diagrams**:...

    Prefuse-master.zip_DEMO_prefuse源码_数据可视化

    Prefuse是一款强大的Java库,专为数据可视化设计。它的核心理念是提供一个灵活、可扩展的框架,使得开发者能够创建出交互式的数据可视化应用。在"Prefuse-master.zip"这个压缩包中,包含了Prefuse项目的源代码,这...

    prefuse API doc

    prefuse API doc prefuse自从2011年后就没更新了,截止2017-11-24

    prefuse打包好的jar文件

    prefuse的jar文件,打包好方便使用

    prefuse-javadoc

    prefuse是数据图形化展示应用编程的不二选择,利用prefuse,你可以将抽象的数据表示为图形、动画、网表等直观的形式,在svn数据挖掘和研究中极为有效,本附件为prefuse的javadoc,内容非常详实。

    prefuse.flare

    prefuse是一个非常不错的开源可视化项目,尤其是用在social network/complex network上,个人感觉要比jung好。不过可惜的是,prefuse的user manual还在建设中,并且google resource也少得可怜。好在开源提供了源码,...

    prefuse.flare类库及demo

    Prefuse和Flare是两个与数据可视化相关的Java库,它们在IT行业中被广泛用于创建复杂的图形和图表。这里我们将深入探讨这两个库的功能、用途以及如何利用它们构建数据可视化应用。 Prefuse是由UC Berkeley的可视化...

    Prefuse-master.zip_DEMO

    例如,"TreeLayout"演示了如何用Prefuse构建层次结构数据的可视化,而"ForceDirectedLayout"则展示了如何用物理模拟的方式布局网络图中的节点和边。 源码中,我们可以学习到如何加载数据,创建Item和VisualItem,...

    prefuse graph 动态显示数据库数据 鼠标点击

    标题 "prefuse graph 动态显示数据库数据 鼠标点击" 暗示我们要讨论的是Prefuse图形库如何用于动态地从数据库中获取数据并实现鼠标交互功能。Prefuse是一个强大的Java图形可视化库,它提供了丰富的图形表示和用户...

Global site tag (gtag.js) - Google Analytics