Java Swingworker无法使用swt?
我正在做一个项目,需要用Java从web页面获取页面内容,有时,我需要在web页面上执行一些javascript,然后他们得到修改后的内容。所以我选择使用SWT工具。以下是代码的一部分:Java Swingworker无法使用swt?,java,eclipse,multithreading,swt,swingworker,Java,Eclipse,Multithreading,Swt,Swingworker,我正在做一个项目,需要用Java从web页面获取页面内容,有时,我需要在web页面上执行一些javascript,然后他们得到修改后的内容。所以我选择使用SWT工具。以下是代码的一部分: public void run(){ Display.getDefault().asyncExec(new Runnable(){ public void run(){ display = Display.getDefault();
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();
}
}
}
});
}
我在类worker
中调用run()
函数,该类从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);
}
}
}
公共类worker扩展SwingWorker{
私有刮削模型;
私有ScrapingView视图;
私人指数;
公共工作者(ScrapingView v,ScrapingModel m,int[]ins){
模型=m;
视图=v;
指数=ins;
}
@凌驾
受保护对象doInBackground()引发异常{
int length=index.length;
对于(int i=0;i而不是将Runnable
包装到asyncExec
Display.getDefault().asyncExec(new Runnable(){
// swt code to open shell
});
创建一个新的线程
Runnable r = new Runnable(){
// swt code to open shell
}
Thread t = new Thread(r);
th.start();