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();
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
@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
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