2016-04-27 80 views
0

好了,我有以下模式:
扩展JFrame的实例其他类 包含我的图表,它返回一个空白屏幕Graphstream视图不加载

  • 的Java类。

  • 第二个正常类的方法主要在里面,调用 包含我的图的同一个类,它返回一个正常的图。

现在,为什么类是一个JFrame返回一个空白图?

我的图类的代码。

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 
    } 

} 

大多数人会说,你为什么在这里创建一个JPANEL?我没有找到如何设置它的默认大小,但即使从内部删除jpanel,它没有工作,显示一个空白的查看器没有任何异常或其他的东西。

这里是我打电话给班级做我必须做的事情。

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); 
    } 

创建我的SwingWorker后,图形被渲染,但用户交互消失。

摆动工人,在这里我只是收集一些信息,让图类能够处理信息。

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; 
    } 

} 

而在这里,它被称为。

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

回答

2

首先,所有类名都应以大写字母开头。 “grafoComparacao”应该是GrafoComparacao

现在,为什么JFrame类返回空白图?

我猜想,你GrafoComparacao类是在一些听众代码,这意味着该代码是在事件调度线程负责画GUI执行创建。

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

这看起来像阻塞是在美国东部时间执行的代码,这就意味着你使用的是一个无限循环,这意味着该代码永远不会执行完毕,因此GUI不能响应事件或重绘自己。

该代码应该在单独的线程上执行(可能是SwingWorker),以便EDT可以自由地响应事件并重新绘制自己。

阅读关于Concurrency in Swing的Swing教程的部分,以获取有关EDT和SwingWorker的更多信息。

+0

好吧,基于该网站的示例鼠标与节点的互动,我必须有,而更新图形的状态。但是,删除它的作品,但鼠标点击停止工作。 – GoldenMedal

+0

@GoldenMedal,是的,你需要循环,但它必须在一个单独的线程!您可以创建一个单独的线程并调用代码或使用SwingWorker。阅读教程! – camickr

+0

恩,谢谢你的回答。我创建了一个Swingworker并调用了在doinbackground中启动我的图的类,实际上它工作正常。但不知怎的,它停下来检索用户交互。我的意思是:所有的按钮点击都不起作用。该图可以在一个线程上工作,并且用户交互来自另一个线程,那是因为它们没有相互通信?我会更新我的问题。 – GoldenMedal