quadri disegno grafico java open source comparatori (Jung e Prefuse) per disegnare topologia di rete

StackOverflow https://stackoverflow.com/questions/4670846

Domanda

che la sorgente Java grafico aperto disegno quadri da utilizzare per un diagramma di rete con i seguenti requisiti? Il grafico avrà meno di 1000 nodi.

1) ha bordi paralleli
2) diretto e bordi non orientato in un unico grafico
3) i nodi rappresentati da immagini
4) l'interazione dell'utente con i nodi e spigoli
5) aggiungendo dinamicamente / nodi eliminazione e spigoli
6) l'etichettatura multipla su nodi e spigoli, diversi livelli di etichettatura può essere disattivato / a dagli utenti. (Come disegno a strati e spegnere / su un livello)
7) algoritmi di diverso layout a stella visualizzazione, anello, maglia topologie

Ho valutato JUNG e Prefuse. Questo è quello che ho trovato per ciascuno dei miei requisiti.

1) Prefuse non può visualizzare bordi paralleli mentre JUNG lo supporta. Può Prefuse codice essere manipolato per visualizzare bordi paralleli? Dal momento che si tratta di dati di base di livello cambia Credo che questo sarebbe più difficile che il solito personalizzato di rendering modifiche.

2) non ho trovato alcun riferimento al grafico combinato (entrambi i bordi orientati e non orientati) sia prefusibile e JUNG. Qualcuno sa altrimenti?

3) Questo sembra facile sia con Prefuse e JUNG

4) Anche in questo caso sia prefusibile e JUNG fornisce il supporto per l'interazione dell'utente.

5) Sia Prefuse e supporti Jung. Come fa ogni quadro esegue mentre ridisegnare il grafico? Ho visto in un altro post che Prefuse non esegue bene per gli aggiornamenti dinamici ( Prefuse Toolkit: aggiungendo dinamicamente nodi e spigoli )

6) Questo scende a modificare il grafico e ridisegno. Quindi la domanda diventa lo stesso di 5)

7) Sia Jung prefusibile ha molteplici algoritmi di layout. Ma Quando ho cercato di visualizzare lo stesso insieme di dati utilizzando FruchtermanReingoldLayout sia JUNG e Prefuse ottengo diversi display. Tutte le idee perché? In qualche modo gli algoritmi di layout in Prefuse sembrano mostrare un layout migliore rispetto a JUNG (rendering è anche meglio credo) se la maggior parte degli algoritmi di layout in Prefuse si basano sull'attuazione JUNG. Prefuse layout quali ForceDirectedLayout / FruchtermanReingoldLayout e CircleLayout mappe direttamente a stella, cerchio, maglia topologie.

Al di fuori di questi requisiti, Prefuse ha un buon supporto per le espressioni e linguaggio di query, ma sembra che non viene sviluppato attivamente a differenza JUNG. che si ha una migliore visualizzazione? Qualche suggerimento su quale sarà adatto e come superare le carenze?

Tutti gli altri quadri là fuori che posso usare?

È stato utile?

Soluzione

Alcuni anni fa (2007?) Io uso Prefuse di visualizzare i record di dati delle chiamate. Ho considerato Prefuse, jung, Jgraph e pochi altri e ha scelto Prefuse. In un primo momento un po 'difficile per avvolgere la mia testa intorno Prefuse ma una volta ho avuto familiarità con esso è davvero facile (per estendere) e divertente da usare. Credo che lo stesso si può dire per JUNG ma non ho mai provato.

1) In Prefuse è molto facile aggiungere la tua renderer personalizzato per disegnare bordi paralleli - è possibile creare una sottoclasse del EdgeRenderer di default e l'override del metodo render (). Non c'è nessun "modifiche a livello di dati di base" necessari. Questo è tutto nella parte vista se vuoi pensare ad esso come un roba MVC.

2) Questo non è un problema a tutti. Ci sono più di un modo per farlo: 1) E 'possibile avere due renderer - uno per disegnare i bordi diretti e uno per disegnare i bordi non orientati e faranno funzionare bene, e il gruppo i bordi in modo appropriato. 2) Mettere un flag (aggiungere una colonna booleana nella tupla tavolo backing in prefusibile dire) per indicare se il bordo è diretto e saltare la porzione disegno freccia conseguenza nel EdgeRender secondo quella bandiera.

3) Questo è super facile

4) idem

5) L'ultimo rilascio Prefuse è "Prefuse versione beta 2007/10/21". Ho usato quello prima ancora, che hanno una possibile condizione di gara, quando aggiungendo o eliminando i nodi in modo dinamico - mancava un paio di parole chiave sincronizzati credo. Ho risolto che facendo in modo di fermare tutte le animazioni e le azioni (colore, formato, layout) per aggiungere o rimuovere i nodi - Inoltre, non dimenticare di aggiornare gli indici Lucene e (se si utilizza la sua built-in motore di ricerca Lucene ). Il più recente si suppone per risolvere questo problema gara ma non ho mai avuto la possibilità di provarlo.

6) Dal momento che lei ha citato "l'etichettatura multipla" Credo che questa non è una questione di "modificare il grafico e il ridisegno it" - è solo una questione di personalizzazione delle etichette / renderer bordo per disegnare solo le etichette rilevanti, quindi questo non è davvero un grosso problema. Anche io non credo che questo è legato alla 5 a tutti.

7) Non mi stupisce che Prefuse e rendering del FruchtermanReingoldLayout di Jung sono diversi - ci sono alcuni fattori che possono influenzare questo uno dei loro il nodo di partenza in cui ogni applicazione avviare il calcolo quindi non mi preoccuperei molto di questa edizione. E 'abbastanza facile da provare i diversi algoritmi di layout grafico incorporato in Prefuse in modo da poter andare avanti e verificare che uno è più vicino a quello che si desidera avere. Controlla la RadialLayout e BalloonTreeLayout per il layout stella. ForceDirectedLayout ha bisogno di un bel paio di iterazioni per il posizionamento dei nodi di essere "stabile". Si noti che queste iterazioni non è necessario per essere mostrato in modo da poter eseguire in background e rendere il risultato finale.

Non ho utilizzare JUNG quindi non posso commentare molto su di esso.

In base alla mia esperienza con Prefuse lo consiglio vivamente a causa del molto bene (IMHO) congegnato progettazione e la separazione delle resposibility tra i componenti. Jeffrey Heer (Prefuse autore) ha fatto davvero un buon lavoro.

Cose a cui prestare attenzione se si utilizza Prefuse (questi sono i due "mal-pollici" che mi ricordo vividamente quando si lavora con Prefuse):

1) C'è un problema per cui quando lo zoom out, le etichette dei nodi non ingrandito opportunamente tale che trabocca il riquadro di delimitazione del nodo che lascerà artefatti disegno di carattere quando i movimenti nodo perché il rendering cancella solo e ridisegna roba all'interno il nodo della casella di delimitazione. IIRC questo è causato da un bug nel AWT Font metrica stessa. La soluzione è lasciare ampio margine tra l'etichetta e il nodo riquadro di delimitazione.

2) Quando si estende il built-in layout, è possibile incontrare uno o due "questione scoping", in cui un membro della superclasse che si desidera avere accesso a è dato l'attributo private anziché protetto in modo che la soluzione è a uno modificare la libreria stessa o creare una nuova classe senza inheriting (che può essere un po 'doloroso!). Credo che si può dire lo stesso per alcune altre librerie Java. Non tutti hanno il senno di poi no? :)

Dal momento che questa domanda circa un mese fa (al tempo di me scrivere questo) mi piacerebbe sapere che cosa la vostra decisione era e come si è scoperto per voi se è andato avanti con l'implementazione.

Altri suggerimenti

Sono uno dei creatori e manutentori di JUNG, in modo da tenere a mente per le risposte qui sotto.

Per prima cosa, però, devo dire che l'autore di Prefuse è un amico di un amico (e sì, abbiamo incontrato) e ha fatto un ottimo lavoro. Io non sono esperto con Prefuse, ma ho visto alcune belle visualizzazioni create con esso.

Ecco le risposte a queste domande per Jung. Molti di loro ((1), (2), (4) sono illustrati in PluggableRendererDemo:

  1. supportati (è necessario il modello giusto di dati, non tutti i bordi di supporto paralleli per motivi di prestazioni)
  2. supportati (ancora una volta, è necessario il modello di dati a destra)
  3. supportati (vedi ImageShaperDemo)
  4. supportati (la maggior parte delle demo)
  5. supportati (vedi GraphEditorDemo)
  6. Non supportato direttamente, anche se si può certamente modificare le etichette in modo dinamico e utilizzare HTML per rendere le etichette complesse.
  7. algoritmi di layout di Jung sono più per le reti generali (con alcune eccezioni per gli alberi, etc.). Si può certamente costruire i propri algoritmi di layout, tuttavia, e molti hanno fatto così.

Spero che questo aiuti.

Lo so specificato Jung e Prefuse ma ... Ho avuto una buona esperienza sia con TomSawyer e yFiles. elencano i requisiti avete proposto è molto semplice a questi due -. e supportano molto altro ancora

Ran.

I suggerirei valutando Jgraph troppo.

Mi piace la risposta di @ holygeek. Ecco la mia implementazione della soluzione per 2 (entrambi diretti ed i bordi non orientati), per Prefuse:

public class MyRenderFactory implements RendererFactory
{
    private NodeRenderer nodeRenderer = new NodeRenderer();
    private EdgeRenderer defaultEdgeRenderer = new EdgeRenderer();
    private EdgeRenderer undirectedEdgeRenderer = new EdgeRenderer(EdgeRenderer.EdgeType.LINE, EdgeRenderer.EdgeArrowType.NONE);

    public static String directedness = "myEdgeDirectedness";

    public enum EdgeDirected
    {
        directed, undirected;

        public static EdgeDirected fromIsDirected(boolean isDirected)
        {
            if (isDirected)
            {
                return directed;
            }
            return undirected;
        }
    }

    @Override
    public Renderer getRenderer(VisualItem<?> visualItem)
    {
        if (visualItem instanceof EdgeItem)
        {
            if (visualItem.get(directedness).equals(PrefuseGraphConverter.EdgeDirected.undirected))
            {
                return undirectedEdgeRenderer;
            }
            return defaultEdgeRenderer;
        }
        return nodeRenderer;
    }
}

... altrove, in cui viene creato il grafico ...

MyRenderFactory.EdgeDirected directedness =
        MyRenderFactory.EdgeDirected.fromIsDirected(myEdge.isDirected());
prefuseEdge.set(MyRenderFactory.directedness, directedness);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top