2016-04-27 3 views
0

Ну, у меня есть следующие схемы:
Graphstream вида не загружая

  • A Java класс, который расширяет JFrame инстанцирования другого класса, который содержит моего графика, который возвращает пустой экран.

  • Второй нормальный класс с основным методом внутри него, вызывающий тот же класс, который содержит мой график, который возвращает нормальный граф.

Теперь, почему класс, который является 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(); 
} 

Это выглядит как блокирующий код, исполняемый на EDT, и означает, что вы используете бесконечный цикл, который означает, что код никогда не заканчивает выполняющийся поэтому GUI никогда не может реагировать на события или перерисовать себя.

Этот код должен выполняться в отдельной теме (возможно, SwingWorker), поэтому EDT может реагировать на события и перекрашивать себя.

Для получения дополнительной информации о EDT и SwingWorker прочтите раздел из руководства Swing по телефону Concurrency in Swing.

+0

Хорошо, на основе примера сайта, чтобы мышь взаимодействовала с узлами, я должен иметь это, чтобы обновлять состояния графика. Но, удалив, что он работает, но щелчок мыши перестает работать. – GoldenMedal

+0

@GoldenMedal, да, вам нужен цикл, но он должен быть на отдельной теме !!!Вы можете создать отдельный поток и вызвать код или нас SwingWorker. Прочтите учебник! – camickr

+0

Хорошо, спасибо за ответ. Ive создал Swingworker и вызвал класс, который начинает мой график внутри doinbackground, фактически работал. Но почему-то он остановился, чтобы восстановить взаимодействие с пользователем. Что я имею в виду: все нажатия на кнопки не работают. Граф может работать над одним потоком, а взаимодействие с пользователем происходит от другого, потому что они не взаимодействуют друг с другом? Я уточню свой вопрос. – GoldenMedal

 Смежные вопросы

  • Нет связанных вопросов^_^