好了,我有以下模式:
擴展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();
好吧,基於該網站的示例鼠標與節點的互動,我必須有,而更新圖形的狀態。但是,刪除它的作品,但鼠標點擊停止工作。 – GoldenMedal
@GoldenMedal,是的,你需要循環,但它必須在一個單獨的線程!您可以創建一個單獨的線程並調用代碼或使用SwingWorker。閱讀教程! – camickr
恩,謝謝你的回答。我創建了一個Swingworker並調用了在doinbackground中啓動我的圖的類,實際上它工作正常。但不知怎的,它停下來檢索用戶交互。我的意思是:所有的按鈕點擊都不起作用。該圖可以在一個線程上工作,並且用戶交互來自另一個線程,那是因爲它們沒有相互通信?我會更新我的問題。 – GoldenMedal