Я с трудом пытаюсь найти способ правильно заполнить элемент графического интерфейса SWT, который занимает некоторое время (то есть: я не хочу, чтобы он повесил приложение). В настоящее время я делаю это, но я чувствую, что должен быть лучший способ.
Причина, по которой я должен был сделать это, была в том, что:
- Мне нужно было запустить задачу в фоновом режиме, чтобы установить какой-то виджет
- Вы всегда должны изменять виджеты SWT из функции asyncExec на дисплее
- Это единственный способ понять это - с помощью двух потоков, вызывающих функции - нонсенс, грязный
Простите за любые ошибки кода - я копировал и вставлял из существующего проекта.
public class Gui {
protected Shell shell;
private Display display;
private SomeController someController;
private Label statusLabel;
public void createControllers(){
someController = new someController(this);
}
public void open() {
this.display = Display.getDefault();
createContents();
shell.open();
shell.layout();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
protected void createContents() {
// Create a bunch of stuff
statusLabel = new Label(shell, SWT.NONE);
fd_tabFolder.bottom = new FormAttachment(statusLabel, -6);
Button btnStart = new Button(composite_1, SWT.NONE);
btnStart.addSelectionListener(new SelectionListener() {
public void widgetDefaultSelected(SelectionEvent arg0) {
}
public void widgetSelected(SelectionEvent arg0) {
someController.setStatus("some status");
}
});
}
private Label getStatusLabel(){
return(statusLabel);
}
public Display getDisplay(){
return(display);
}
}
public class SomeController {
private Gui gui;
private Label statusLabel;
public SomeController(Gui gui)
this.gui = gui;
this.statusLabel = gui.getStatusLabel();
}
public void setStatus(String status){
Thread t = new Thread(new SetStatus(status));
t.start();
}
private void setStatusToGui(String status){
gui.getDisplay().asyncExec(new SetStatusRunnable(status));
}
public class SetStatus implements Runnable{
private String status;
public SetStatus(String status){
this.status = status;
}
public void run() {
setStatusToGui(status);
}
}
public class SetStatusRunnable implements Runnable{
private String status;
public SetStatusRunnable(String status){
this.status = status;
}
public void run() {
statusLabel.setText(status);
}
}
}