Java Swingworker не может работать с SWT?

1

Я делаю проект, который должен получать содержимое страницы с веб-страницы на Java, а иногда мне нужно выполнить некоторый javascript на веб-странице, и они получают измененный контент. Поэтому я предпочитаю использовать SWT-инструмент. Вот часть кода:

public void run(){
    Display.getDefault().asyncExec(new Runnable(){
            public void run(){
                display = Display.getDefault();
                shell = new Shell(display,SWT.CLOSE | SWT.MIN |SWT.TITLE);
                shell.setText("Web Page");
                shell.setSize(1024,768);
                browser = new Browser(shell, SWT.NONE);
                browser.setBounds(0, 0, 1010,700);
                browser.addProgressListener(new ProgressListener() {
                    @Override
                    public void completed(ProgressEvent event) {
                        boolean success = browser.execute(script);
                        if(success || script.length()==0){
                            model.setHtml(browser.getText());
                        }
                        shell.dispose();
                    }

                    @Override
                    public void changed(ProgressEvent event) {

                    }
                });
                browser.setUrl(url);

                while (!shell.isDisposed()) {
                    if (!display.readAndDispatch()) {
                        display.sleep();
                    }
                }
            }
        });
}

И я SwingWorker функцию run() внутри worker класса, которая простирается от SwingWorker. Рабочий класс определяется следующим образом:

public class worker extends SwingWorker<Object,Integer>{

private ScrapingModel model;
private ScrapingView  view;
private int[] indices;

public worker(ScrapingView v, ScrapingModel m, int[] ins){
    model = m;
    view = v;
    indices = ins; 
}
@Override
protected Object doInBackground() throws Exception {
    int length = indices.length;
    for(int i=0;i<indices.length;i++){
        int index = indices[i];
        //here call the run() function, sorry I skipped some code
        publish((i+1)*100/length);
    }
    return null;
}
@Override
protected void process(List<Integer> chunks) {
    for (Integer chunk : chunks) {
        view.progressBar.setValue(chunk);
    }
}
}

Вот проблема: код wthin Display.getDefault().asyncExec никогда не выполняется, когда я вызываю функцию run() в worker классе. Однако, если я попытался вызвать run() вне класса worker, он может быть выполнен. Есть идеи?

Теги:
multithreading
swt
swingworker

1 ответ

1
Лучший ответ

Вместо переноса Runnable в asyncExec

Display.getDefault().asyncExec(new Runnable(){
  // swt code to open shell
 });

Создать новую Thread

Runnable r = new Runnable(){
  // swt code to open shell
 }
 Thread t = new Thread(r);
 th.start();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню