2016-04-27 60 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