Я пытаюсь использовать как индикатор хода и метку, чтобы показать прогресс сдержанного количества операций. Каждый раз, когда я обновляю оба значения, ярлык немедленно обновляется, а индикатор выполнения имеет заметную задержку до изменения.Progress Bar не обновляется Сразу
У меня есть тестовое диалоговое окно, где, когда я нажимаю кнопку, я обновляю как метку, так и индикатор выполнения, чтобы отразить увеличение 1. Это происходит сразу же в коде без каких-либо циклов или потоков, вызываемых (, устраняющих любые связанные с потоком вопросы как причина) - простое изменение значений. Когда это происходит, ярлык немедленно обновляется, а индикатор прогресса ожидает около половины секунды перед визуальным обновлением. Это приводит к примерам, где он скажет, например, «2 из 3», когда он кратко, но заметно показывает 1/3 заполненного бара.
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
public class ProgressBarTest extends Shell {
private ProgressBar progressBar;
private Label lblXOfX;
private Button btnGo;
public static void main(String args[]) {
try {
Display display = Display.getDefault();
ProgressBarTest shell = new ProgressBarTest(display);
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public ProgressBarTest(Display display) {
super(display, SWT.SHELL_TRIM);
createContents();
}
protected void createContents() {
setText("SWT Application");
setSize(450, 300);
setLayout(new GridLayout());
progressBar = new ProgressBar(this, SWT.NONE);
progressBar.setMaximum(3);
progressBar.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
lblXOfX = new Label(this, SWT.NONE);
lblXOfX.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
lblXOfX.setText("x of x");
btnGo = new Button(this, SWT.NONE);
btnGo.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(SelectionEvent arg0) {
go();
}
});
btnGo.setText("Go");
}
@Override
protected void checkSubclass() {
// Disable the check that prevents subclassing of SWT components
}
protected void go() {
int iCur = progressBar.getSelection();
iCur++;
if (iCur > progressBar.getMaximum())
iCur = 0;
progressBar.setSelection(iCur);
lblXOfX.setText(String.format("%s of %s", iCur, progressBar.getMaximum()));
}
}
Это происходит, несмотря на использование внутренней переменной прогресс бар, чтобы следить за значением, и используя это значение для обновления метки.
Примечательно, что изменяет свойство состояния «состояние» на «ERROR» или «PAUSED», устраняет проблему.
Это какая-то ошибка с анимацией? Это просто проблема с конкретной версией Windows, например Windows 7, которую я использую? Или что-то еще?
Трудно сказать только с частичным фрагментом, что здесь происходит - можете ли вы представить более полный пример (который мы можем скомпилировать и запустить сами), чтобы продемонстрировать проблему? (см. http://sscce.org/) – Krease
@Chris Очень хорошо, все сделано. –
@Chris Я могу на самом деле сделать это намного проще. Я собираюсь переработать весь вопрос. –