有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java试图清除热情图

我试图从所有节点和连接中清除Zest图,这样我就可以用新节点和连接重新绘制该图。意识到我写了下面的方法

     public void clearGraph( Graph graph ) {        
     Object[] objects = graph.getConnections().toArray() ;          
         for (int i = 0 ; i < objects.length; i++){
             GraphConnection graCon = (GraphConnection) objects[i];              
             graCon.dispose();
             //graCon.setVisible(false);
         }           
     objects = graph.getNodes().toArray();      
     for ( int i = 0 ; i < objects.length; i++){
             GraphNode graNode = (GraphNode) objects[i];
             graNode.dispose();
            //graNode.setVisible(false);
     }
}

这个错误让我的程序崩溃了

Exception in thread "main" org.eclipse.swt.SWTException: Widget is disposed

作为一种解决方法,我尝试将节点和连接设置为“不可见”,这是可行的,但不可见的对象似乎会打乱我的兴趣布局,因此如果有办法实际处理节点和连接,我会选择这种方式

下面是错误信息

Exception in thread "main" org.eclipse.swt.SWTException: Widget is disposed
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.SWT.error(Unknown Source)
at org.eclipse.swt.widgets.Widget.error(Unknown Source)
at org.eclipse.swt.widgets.Widget.checkWidget(Unknown Source)
at org.eclipse.swt.widgets.Item.getText(Unknown Source)
at com.mycom.timelineview.views.IndicatorFactorVisualisationView$2.mouseDoubleClick(IndicatorFactorVisualisationView.java:221)
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at com.mycom.timelineview.views.IndicatorFactorVisualisationView.indicatorFactorWindow(IndicatorFactorVisualisationView.java:249)
at com.mycom.timelineview.views.IndicatorFactorVisualisationView.<init>(IndicatorFactorVisualisationView.java:71)
at com.mycom.timelineview.views.SpiderWebMouseListener.chartMouseClicked(SpiderWebMouseListener.java:102)
at org.jfree.experimental.chart.swt.ChartComposite.mouseDown(ChartComposite.java:1621)
at org.eclipse.swt.widgets.TypedListener.handleEvent(Unknown Source)
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at com.mycom.timelineview.views.SpiderWebView.createPartControl1(SpiderWebView.java:622)
at com.mycom.timelineview.views.InformationPlatformAppView2$7.handleEvent(InformationPlatformAppView2.java:628)
at org.eclipse.swt.widgets.EventTable.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Widget.sendEvent(Unknown Source)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Unknown Source)
at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source)
at com.mycom.timelineview.views.InformationPlatformAppView2.main(InformationPlatformAppView2.java:1330)

编辑:多亏了巴兹,我才发现了我的错误。鼠标侦听器必须在我之前处理的图形节点中搜索文本,所以程序当然必须崩溃。为了避免这种情况,我修改了代码,现在Baz提出的方法运行得很好


共 (1) 个答案

  1. # 1 楼答案

    在调用dispose()之前检查isDisposed()可以避免此问题:

    public void clearGraph( Graph graph )
    {       
        Object[] objects = graph.getConnections().toArray() ;           
        for (int i = 0 ; i < objects.length; i++)
        {
            GraphConnection graCon = (GraphConnection) objects[i];
            if(!graCon.isDisposed())
                graCon.dispose();
        }            
    
        objects = graph.getNodes().toArray();       
        for (int i = 0; i < objects.length; i++)
        {
            GraphNode graNode = (GraphNode) objects[i];
            if(!graNode.isDisposed())
                graNode.dispose();
        }
    }
    

    下面是一个测试示例,即使在选定的节点上也可以正常工作:

    public static void main(String[] args)
    {
        final Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setText("Stackoverflow");
        shell.setLayout(new GridLayout(1, false));
    
        Graph g = new Graph(shell, SWT.NONE);
        g.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    
        Random random = new Random(System.currentTimeMillis());
    
        final List<GraphNode> nodes = new ArrayList<>();
        for (int i = 0; i < 10; i++)
        {
            GraphNode node = new GraphNode(g, SWT.NONE);
            node.setText("TEST");
            node.setLocation(random.nextInt(400), random.nextInt(400));
            nodes.add(node);
        }
    
        for (int i = 0; i < 50; i++)
        {
            GraphNode source;
            GraphNode target;
    
            do
            {
                source = nodes.get(random.nextInt(nodes.size()));
                target = nodes.get(random.nextInt(nodes.size()));
            } while (source.equals(target));
    
            new GraphConnection(g, SWT.NONE, source, target);
        }
    
        Button clear = new Button(shell, SWT.NONE);
        clear.setText("Clear");
        clear.addListener(SWT.Selection, e -> {
            for(GraphNode node : nodes)
            {
                node.dispose();
            }
            nodes.clear();
        });
        clear.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
    
        shell.pack();
        shell.open();
    
        while (!shell.isDisposed())
        {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }