SWTChart не перерисовывается, когда он находится внутри цикла

#java #swt #swtchart

#java #swt #swtchart

Вопрос:

Если у меня есть следующий цикл:

 Chart plot = new Chart(composite, SWT.NONE);
ISeriesSet seriesSet = plot.getSeriesSet();
ISeries series = seriesSet.createSeries(SeriesType.LINE, "Test");

for(int i=0; i<1000; i  ) {
    points = ...
    series.setYSeries(points);
}
  

Диаграмма обновляется недостаточно быстро, даже если я добавляю задержку в цикле. Мне пришлось свернуть окно, а затем развернуть его, чтобы увидеть изменения, другими словами, оно не обновляется после каждого цикла, я попытался принудительно обновить, добавив эти строки внутри цикла:

 plot.redraw();
plot.layout(true, true);
  

Но, похоже, он обновляется только один раз в конце цикла. Есть ли лучшая практика, которой я должен следовать при необходимости быстрого обновления диаграммы?

Ответ №1:

Этот код выполняется в потоке пользовательского интерфейса и будет блокировать обновления пользовательского интерфейса, пока вы не вернетесь к основному Display.readAndDispatch циклу. Код в основном потоке пользовательского интерфейса должен выполняться быстро и возвращаться к основному циклу как можно скорее. Пользовательский интерфейс обновляется только при readAndDispatch выполнении.

Таким образом, вы не можете использовать простой for цикл в потоке пользовательского интерфейса для обновления диаграммы.

Один из способов сделать это — использовать Display.timerExec для выполнения одного шага после задержки.

Или вы можете запустить фоновый поток и поместить туда свой цикл. Из фонового потока вы должны вызвать Display.syncExec для запуска код, который обновляет пользовательский интерфейс.