如何使用Jung根据重量(或其他属性)过滤边缘并显示新网络

时间:2014-04-28 10:02:02

标签: java swing jung

我有一个SparseMultigraph<节点,边缘> g其中edge有两个属性:

int weight;
ArrayList<Date> time;

我想根据重量和时间独立过滤图表。假设我使用名为weightSlider的JSlider(我在Netbeans和Swing中)根据重量开始过滤:

 private void weightSliderMouseReleased(java.awt.event.MouseEvent evt) {                                           
    // filter network according to weight:
    Predicate<Edge> edgeAboveWeight = new Predicate<Edge>() {
        @Override
        public boolean evaluate(Edge e) {
            return e.getWeight() >= weightSlider.getValue();
        }
    };
    EdgePredicateFilter<Node, Edge> edgePredicateFilter = new EdgePredicateFilter<>(edgeAboveWeight);
    Graph<Node, Edge> transform = edgePredicateFilter.transform(g);
}         

我的问题是:如何在可视化中推送新图形,保留节点位置?

由于这是我第一次尝试这样做,我可能错过了一种更简单的方法来实现我的目标,所以任何建议都非常受欢迎!

编辑:我成功实现了这个:

private void weightSliderMouseReleased(java.awt.event.MouseEvent evt) {                                           
    // filter network according to weight:
    Predicate<Edge> edgeAboveWeight = new Predicate<Edge>() {
        @Override
        public boolean evaluate(Edge e) {
            return e.getWeight() >= weightSlider.getValue();
        }
    };
    EdgePredicateFilter<Node, Edge> edgePredicateFilter = new EdgePredicateFilter<>(edgeAboveWeight);
    Graph<Node, Edge> transform = edgePredicateFilter.transform(g);
    layout.setGraph(transform);
    vv.validate();
    vv.repaint();
}        

仍然不知道它是否是最有效的方式,但它有效......

1 个答案:

答案 0 :(得分:0)

如果您想过滤实际数据,那么您正在做的事情很好。

如果您想要做的只是过滤权重低于特定值的边缘,那么您可以直接告诉PluggableRendererContext:

http://jung.sourceforge.net/doc/api/edu/uci/ics/jung/visualization/PluggableRenderContext.html#setEdgeIncludePredicate(org.apache.commons.collections15.Predicate)

这在PluggableRendererDemo中进行了演示。