2016-06-15 2 views
0

Я пытаюсь очистить график Zest от всех узлов и соединений, чтобы я мог перерисовать график с новыми узлами и соединениями. Для того, чтобы понять, что я написал следующий методПопробуйте очистить график 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); 
    } 
} 

Это происходит сбой мой prorgam с ошибкой

Исключение в потоке «основной» org.eclipse.swt.SWTException: Виджет расположен

В качестве обходного пути я попытался настроить узлы и соединения на невидимые, что работает, но невидимые объекты, похоже, испортили мой макет Zest, поэтому, если есть способ фактически распорядиться узлами и соединениями, я бы предпочел бы это.

Вот массажный об ошибке

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) 

EDIT: Благодаря Baz я нашел свою ошибку. Пользователю Mouse пришлось искать текст в узле графа, который я разместил до этого, конечно, программа должна была сбой. Я изменил свой код, чтобы избежать этого, и теперь предлагаемый метод Baz работает отлично.

+0

Вы взглянули на это : https://www.eclipse.org/forums/index.php/t/79464/? – Baz

+0

Я обновил свой ответ на примере, который работает отлично. – Baz

ответ

0

Проверка isDisposed() перед вызовом dispose() предотвратит эту проблему:

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(); 
} 
+0

Это не так. Я думаю, моя проблема может заключаться в том, что выбран GraphNode, который я хочу удалить. Есть ли способ отменить выбор graphNode? – hanneshelge

+0

Попробуйте 'Graph # setSelection (null)' или 'Graph # setSelection (новый GraphItem [0])'. – Baz

+0

проверка с .isSelected() Я узнал, что нет выбранного GraphNode, поэтому я могу решить эту проблему как проблему. Я также обнаружил, что удаление соединений не вызывает никаких проблем. Однако избавление от GraphNodes по-прежнему вызывает у меня виджет ошибки – hanneshelge

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