как фильтровать ребра по весу (или другому свойству) с Юнгом и отображать новую сеть

У меня есть узел SparseMultigraph‹, Edge > g, где края имеют два атрибута:

int weight;
ArrayList<Date> time;

Я хотел бы отфильтровать график по весу и времени независимо. Скажем, я начинаю фильтровать по весу, используя JSlider с именем weightSlider (я в 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();
}        

До сих пор не знаю, самый ли это эффективный способ, но он работает...


person user299791    schedule 28.04.2014    source источник


Ответы (1)


Если вы хотите отфильтровать фактические данные, то то, что вы делаете, в порядке.

Если вы хотите просто отфильтровать края, чей вес ниже определенного значения, от рендеринга, вы можете напрямую указать PluggableRendererContext:

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

Это продемонстрировано в PluggableRendererDemo.

person Joshua O'Madadhain    schedule 28.04.2014