6

我做了功课,并在谷歌上搜索了一个示例和一个之前在 stackoverflow 上回答的主题。但是什么也没找到。

我的问题是没有像箭头一样的视图的普通边缘。

这是我希望从目标到目的地的前进箭头所做的事情:

LabelRenderer nameLabel = new LabelRenderer("name");
        nameLabel.setRoundedCorner(8, 8);
        DefaultRendererFactory rendererFactory = new DefaultRendererFactory(nameLabel);
        边缘渲染器边缘渲染器;
    edgeRenderer = new EdgeRenderer(prefuse.Constants.EDGE_TYPE_LINE, prefuse.Constants.EDGE_ARROW_FORWARD);
        rendererFactory.setDefaultEdgeRenderer(edgeRenderer);
        vis.setRendererFactory(rendererFactory);


这是我看到的边缘颜色,希望这些不能是透明的:

int[] 调色板 = new int[]{ColorLib.rgb(255, 180, 180), ColorLib.rgb(190, 190, 255)};

        DataColorAction fill = new DataColorAction("socialnet.nodes", "gender", Constants.NOMINAL, VisualItem.FILLCOLOR, palette);

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


        ColorAction 边缘 = new ColorAction("socialnet.edges", VisualItem.STROKECOLOR, ColorLib.gray(200));
        ColorAction 箭头 = new ColorAction("socialnet.edges", VisualItem.FILLCOLOR, ColorLib.gray(200));

        动作列表颜色 = 新动作列表();
        color.add(填充);
        color.add(文本);
        colour.add(边缘);
        color.add(箭头);
        vis.putAction("color", colour);

因此,我想知道我错在哪里?为什么我的边缘看起来不像箭头?

感谢您的任何想法。

有关更多详细信息,我想粘贴所有代码:

/*
 * 要更改此模板,请选择工具 | 模板
 * 并在编辑器中打开模板。
 */

包prefusedeneme;

导入 javax.swing.JFrame;

导入 prefuse.data.*;
导入 prefuse.data.io.*;
导入prefuse.Display;
导入prefuse.Visualization;
导入 prefuse.render.*;
导入 prefuse.util.*;
导入 prefuse.action.assignment.*;
导入prefuse.Constants;
导入 prefuse.visual.*;
导入 prefuse.action.*;
导入 prefuse.activity.*;
导入 prefuse.action.layout.graph.*;
导入 prefuse.controls.*;
导入 prefuse.data.expression.Predicate;
导入 prefuse.data.expression.parser.ExpressionParser;

公共类 SocialNetworkVis {

    公共静态无效主要(字符串argv []){

        // 1. 加载数据

        图图=空;
        /* 图表将包含核心数据 */
        尝试 {
            graph = new GraphMLReader().readGraph("socialnet.xml");

        /* 从 XML 文件中加载数据 */
        } 捕捉(DataIOException e){
            e.printStackTrace();
            System.err.println("加载图表时出错。退出...");
            System.exit(1);
        }

        // 2. 准备可视化

        可视化 vis = new Visualization();
        /* vis 是运行可视化的主要对象 */
        vis.add("socialnet", graph);
        /* 将我们的数据添加到可视化中 */

        // 3. 设置渲染器和渲染工厂

        // 名称标签
        LabelRenderer nameLabel = new LabelRenderer("name");
        nameLabel.setRoundedCorner(8, 8);
        /* nameLabel 描述如何绘制标记为“name”的数据元素 */

        // 创建渲染工厂
        DefaultRendererFactory rendererFactory = new DefaultRendererFactory(nameLabel);
        边缘渲染器边缘渲染器;
    edgeRenderer = new EdgeRenderer(prefuse.Constants.EDGE_TYPE_LINE, prefuse.Constants.EDGE_ARROW_FORWARD);
        rendererFactory.setDefaultEdgeRenderer(edgeRenderer);
        vis.setRendererFactory(rendererFactory);


        // 4. 处理动作

        // 标称数据类型的调色板
        int[] 调色板 = new int[]{ColorLib.rgb(255, 180, 180), ColorLib.rgb(190, 190, 255)};
        /* ColorLib.rgb 将颜色值转换为整数 */


        // 将数据映射到调色板中的颜色
        DataColorAction fill = new DataColorAction("socialnet.nodes", "gender", Constants.NOMINAL, VisualItem.FILLCOLOR, palette);
        /* fill 描述了根据部分数据绘制图形的颜色 */

        // 节点文本
        ColorAction text = new ColorAction("socialnet.nodes", VisualItem.TEXTCOLOR, ColorLib.gray(0));
        /* text 描述了绘制文本的颜色 */

        // 边缘
        ColorAction 边缘 = new ColorAction("socialnet.edges", VisualItem.STROKECOLOR, ColorLib.gray(200));
        ColorAction 箭头 = new ColorAction("socialnet.edges", VisualItem.FILLCOLOR, ColorLib.gray(200));
        /* edge 描述绘制边缘的颜色 */

        // 将颜色分配组合成一个动作列表
        动作列表颜色 = 新动作列表();
        color.add(填充);
        color.add(文本);
        colour.add(边缘);
        color.add(箭头);
        vis.putAction("color", colour);
        /* 将颜色动作添加到可视化 */

        // 为布局创建一个单独的动作列表
        ActionList 布局 = new ActionList(Activity.INFINITY);
        layout.add(new ForceDirectedLayout("socialnet"));
        /* 使用带有默认参数的强制导向图布局 */

        layout.add(new RepaintAction());
        /* 每次移动图节点后重新绘制 */

        vis.putAction("布局", 布局);
        /* 将 laout 动作添加到可视化中 */

        // 5. 为可视化添加交互控件

        显示显示 = 新显示(可见);
        display.setSize(700, 700);
        display.pan(350, 350); //平移到中间
        display.addControlListener(new DragControl());
        /* 允许拖动项目 */

        display.addControlListener(new PanControl());
        /* 允许平移显示(左/右,上/下)(左拖动)*/

        display.addControlListener(new ZoomControl());
        /* 允许缩放显示(右拖动)*/

        // 6. 在 JFrame 中启动可视化工具

        JFrame frame = new JFrame("prefuse tutorial: socialnet");
        /* 框架是主窗口 */

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        框架。添加(显示);
        /* 将显示(包含可视化)添加到窗口 */

        框架.pack();
        frame.setVisible(true);

        /* 开始可视化工作 */
        vis.run("颜色");
        vis.run("布局");

    }
}


4

2 回答 2

2

如果您对 prefuse 论坛中给出的答案感到满意,我不确定您的评论。因此,我使用了代码并通过以下更改能够获得您想要的行为。

我更改了输入 xml,以便指向图形元素的 edgedefault。

... <graph edgedefault="directed"> ...

然后在代码中我使用了不同的 EdgeRenderer 边缘类型和箭头类型,以确保我可以打开和关闭箭头,或者让它们向前或向后显示。我也尝试过曲线。例如:

edgeRenderer = new EdgeRenderer(prefuse.Constants.EDGE_TYPE_CURVE, prefuse.Constants.EDGE_ARROW_FORWARD);

同样,您可能已经在其他论坛中得到了答案。

于 2011-04-24T04:23:21.527 回答
0

我偶然发现了同样的问题。对于即将开始使用 prefuse 库的未来用户:如果要在 RadialGraphView 示例中添加箭头,则需要进行 ditkin 提到的更改并添加以下行:

ColorAction arrowColor = new ColorAction("tree.edges", VisualItem.FILLCOLOR, ColorLib.gray(200));

以及以下:

// create the filtering and layout:
[...]
filter.add(arrowColor); // add this one

基本上,答案在 sourceforge 线程中,但我想在这里提供一个解决方案。merve 的代码包含这些说明。

于 2012-01-06T09:16:45.120 回答