Ну, у меня есть следующие схемы:
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();
Хорошо, на основе примера сайта, чтобы мышь взаимодействовала с узлами, я должен иметь это, чтобы обновлять состояния графика. Но, удалив, что он работает, но щелчок мыши перестает работать. – GoldenMedal
@GoldenMedal, да, вам нужен цикл, но он должен быть на отдельной теме !!!Вы можете создать отдельный поток и вызвать код или нас SwingWorker. Прочтите учебник! – camickr
Хорошо, спасибо за ответ. Ive создал Swingworker и вызвал класс, который начинает мой график внутри doinbackground, фактически работал. Но почему-то он остановился, чтобы восстановить взаимодействие с пользователем. Что я имею в виду: все нажатия на кнопки не работают. Граф может работать над одним потоком, а взаимодействие с пользователем происходит от другого, потому что они не взаимодействуют друг с другом? Я уточню свой вопрос. – GoldenMedal