2016-04-27 3 views
0

Nun Laden, ich habe folgende Schemata:
Graphstream Ansicht nicht

  • Eine Java-Klasse, die JFrame Instanziieren die andere Klasse erweitert, dass mein Diagramm enthält, die einen leeren Bildschirm zurückkehrt.

  • Die zweite eine normale Klasse mit der Methode main innerhalb davon, ruft die gleiche Klasse, die mein Diagramm enthält, die eine normale Grafik zurückgibt.

Nun, warum die Klasse, die ein JFrame ist, eine leere Grafik zurückgibt?

Mein Code der Grafikklasse.

public class grafoComparacao implements ViewerListener { 
    private List<Comparados> integralizacoesComparadas; 
    private Viewer viewer; 
    private Graph graph; 
    private View view; 
    protected boolean loop = true; 

    public grafoComparacao(List<Comparados> listaComparados) throws HeadlessException, InterruptedException { 
     System.setProperty("org.graphstream.ui.renderer", "org.graphstream.ui.j2dviewer.J2DGraphRenderer"); 
     this.integralizacoesComparadas = listaComparados; 
     graph = new MultiGraph("clicks"); 
     graph.addAttribute("ui.stylesheet", GraphsStreamStylesheet.stylesheet); 

     adicionaNodes(graph); 

     viewer = new Viewer(graph, Viewer.ThreadingModel.GRAPH_IN_ANOTHER_THREAD); 
     viewer.enableAutoLayout(); 
     view = viewer.addDefaultView(false); 

     JFrame frame = new JFrame("Comparação de catálogos"); 
     frame.add((Component) view); 
     frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

     ViewerPipe fromViewer = viewer.newViewerPipe(); 
     fromViewer.addViewerListener(this); 
     fromViewer.addSink(graph); 

     frame.setVisible(true); 

     while(loop) { 
      fromViewer.pump(); 
     }   
    } 

    //this actually works too. 
// public static void main(String[] args) throws HeadlessException, InterruptedException{ 
//  Control.Controller ctrl = new Controller(); 
//  JFileChooser escolherAlunos = new JFileChooser(); 
//  escolherAlunos.setMultiSelectionEnabled(true); 
//  escolherAlunos.showOpenDialog(null); 
//  File[] integralzacoes = escolherAlunos.getSelectedFiles(); 
//  List<Comparados> integralizacoesComparadas = ctrl.geraComparacaoIntegralizacoes(integralzacoes); 
//  try { 
//   grafoComparacao comparacao = new grafoComparacao(integralizacoesComparadas); 
//  } catch (HeadlessException ex) { 
//   Logger.getLogger(FrmPrincipal.class.getName()).log(Level.SEVERE, null, ex); 
//  } catch (InterruptedException ex) { 
//   Logger.getLogger(FrmPrincipal.class.getName()).log(Level.SEVERE, null, ex); 
//  } 
//  new grafoComparacao(integralizacoesComparadas); 
// } 

    @Override 
    public void viewClosed(String string) { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

    @Override 
    public void buttonPushed(String string) { 

    } 

    @Override 
    public void buttonReleased(String string) { 
     throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
    } 

    private void adicionaNodes(Graph graph) { 
     //function that populate my graph 
    } 

} 

Die meisten werden sagen, warum haben Sie hier ein JPANEL erstellt? Ich fand nicht, wie man die Standardgröße von ihm einstellt, aber das jpanel sogar von innen entfernend, funktionierte es nicht, zeigt einen leeren Projektor ohne irgendeine Ausnahme oder andere Sache.

Hier ist, wo ich die Klasse tun Sachen nennen, die ich tun muss.

JFileChooser escolherAlunos = new JFileChooser(); 
    escolherAlunos.setMultiSelectionEnabled(true); 
    escolherAlunos.showOpenDialog(null); 
    File[] integralzacoes = escolherAlunos.getSelectedFiles(); 
    List<Comparados> integralizacoesComparadas = ctrl.geraComparacaoIntegralizacoes(integralzacoes); 
    try {  
     grafoComparacao comparacao = new grafoComparacao(integralizacoesComparadas); // heres the graph call. 
    } catch (HeadlessException ex) { 
     Logger.getLogger(FrmPrincipal.class.getName()).log(Level.SEVERE, null, ex); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(FrmPrincipal.class.getName()).log(Level.SEVERE, null, ex); 
    } 

Nach der Erstellung meines SwingWorker wurde das Diagramm gerendert, aber die Benutzerinteraktion verschwand.

Swing Worker, hier sammle ich nur einige Informationen, um der Graphklasse die Möglichkeit zu geben, Informationen zu verarbeiten.

public class VisualizacaoWorker extends SwingWorker<Void, Void>{ 
    private List<Comparados> listao; 
    public VisualizacaoWorker(List<Comparados> lista){ 
     this.listao = lista; 
    } 

    @Override 
    protected Void doInBackground() throws Exception { 
     GrafoComparacao gf = new GrafoComparacao(this.listao); 
     return null; 
    } 

} 

Und hier, wo es heißt.

JFileChooser escolherAlunos = new JFileChooser(); 
escolherAlunos.setMultiSelectionEnabled(true); 
escolherAlunos.showOpenDialog(null); 
File[] integralzacoes = escolherAlunos.getSelectedFiles(); 
List<Comparados> integralizacoesComparadas = ctrl.geraComparacaoIntegralizacoes(integralzacoes); 
VisualizacaoWorker visualizacaoWorker = new VisualizacaoWorker(integralizacoesComparadas); 
visualizacaoWorker.execute(); 

Antwort

2

Zunächst sollten Klassennamen mit einem Großbuchstaben beginnen. "GrafoComparacao" sollte GrafoComparacao sein.

Nun, warum die Klasse, die ein JFrame ist, eine leere Grafik zurückgibt?

Ich würde vermuten, dass Ihre GrafoComparacao Klasse in einigen Zuhörern Code erstellt wird, die die Codemittel auf dem Event Dispatch Thread ausgeführt wird, die für die Malerei der GUI verantwortlich ist.

while(loop) 
{ 
    fromViewer.pump(); 
} 

Das wie Versperren Code sieht, die auf dem EDT ausgeführt wird, und bedeutet, dass Sie eine Endlos-Schleife verwenden, die nie den Code bedeutet Ausführung beendet, so dass die GUI kann nie auf Ereignisse reagieren oder sich neu streichen.

Dieser Code sollte auf einem separaten Thread (vielleicht SwingWorker) ausgeführt werden, damit der EDT auf Ereignisse reagieren und sich neu streichen kann.

Lesen Sie den Abschnitt aus dem Swing-Lernprogramm unter Concurrency in Swing, um weitere Informationen zum EDT und zu einem SwingWorker zu erhalten.

+0

Nun, basierend auf dem Beispiel der Website, um Mausinteraktion mit den Knoten zu haben, muss ich das haben, während die Zustände des Graphen zu aktualisieren. Aber entfernen, dass es funktioniert, aber der Mausklick aufhören zu arbeiten. – GoldenMedal

+0

@GoldenMedal, Ja, Sie brauchen die Schleife, aber es muss auf einem separaten Thread sein !!!Sie können entweder einen separaten Thread erstellen und den Code oder einen SwingWorker aufrufen. Lesen Sie das Tutorial! – camickr

+0

Nun, danke für die Antwort. Ich habe einen Swingworker erstellt und die Klasse aufgerufen, die meinen Graphen innerhalb des Doinbackgrounds startet. Aber irgendwie hat es aufgehört, Benutzerinteraktion abzurufen. Was ich damit meine: Alle Tastenklicks funktionieren nicht. Das Diagramm könnte an einem Thread arbeiten und die Benutzerinteraktion kommt von einem anderen, das heißt, weil sie nicht miteinander kommunizieren? Ich werde meine Frage aktualisieren. – GoldenMedal