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 楼答案
在调用
dispose()
之前检查isDisposed()
可以避免此问题:下面是一个测试示例,即使在选定的节点上也可以正常工作: