0

好吧,我有以下模式:

  • 扩展 JFrame 的 Java 类实例化包含我的图形的另一个类,该图形返回一个空白屏幕。

  • 第二个是一个普通的类,里面有 main 方法,调用包含我的图的同一个类,它返回一个普通的图。

现在,为什么作为 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 后,图形被渲染,但用户交互消失了。

Swing 工作者,在这里我只是收集一些信息,以便为图形类提供处理信息的可能性。

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

1 回答 1

2

首先,类名应以大写字符开头。“grafoComparacao”应该是GrafoComparacao.

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

我猜你的GrafoComparacao类是在一些侦听器代码中创建的,这意味着代码在负责绘制 GUI 的事件调度线程上执行。

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

这看起来像是在 EDT 上执行的阻塞代码,这意味着您正在使用无限循环,这意味着代码永远不会完成执行,因此 GUI 永远无法响应事件或重新绘制自身。

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

阅读 Swing 教程中有关Swing 中的并发的部分,以获取有关 EDT 和 SwingWorker 的更多信息。

于 2016-04-27T20:26:16.477 回答