这是一个用SWT做的Browser,现在有一个小问题,就是点击页面上的链接后,会弹出一个IE的窗口和自己做的浏览器窗口,而浏览器窗口页面什么都没有?请教下,怎么解决?
第二个问题,在新线程中,locationText(地址栏),怎么不起作用了?谢谢哈!!!
import org.eclipse.swt.SWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.CloseWindowListener;
import org.eclipse.swt.browser.TitleListener;
import org.eclipse.swt.browser.TitleEvent;
import org.eclipse.swt.browser.VisibilityWindowListener;
import org.eclipse.swt.browser.WindowEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.ProgressBar;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;public class Browser2 
{
 Display display;
private Shell shell;

private Composite com;
private Button forwardButton;
public Button backButton;
public Button stopButton;
public Button refreshButton;

public  Text locationText;
public Button goButton;


public Label statusText;
public ProgressBar progressBar;
private Browser browser;

public String url;
public void setUrl(String string)
{
this.url=string;
}
public void createMenuBar(Shell shell)
{

}

public ToolBar createToolBar(Shell shell)
{
   ToolBar toolBar=new ToolBar(shell,SWT.None);
   ToolItem forwardItem=new ToolItem(toolBar,SWT.None);
   forwardItem.setText("前进");
   ToolItem backItem=new ToolItem(toolBar,SWT.None);
   backItem.setText("后退");
   ToolItem stopItem=new ToolItem(toolBar,SWT.None);
   stopItem.setText("停止");
   ToolItem refreshItem=new ToolItem(toolBar,SWT.None);
   refreshItem.setText("刷新");
  
   toolBar.pack();
   return toolBar;
} public Composite createAddressBar(Shell shell)
{

Composite com =new Composite(shell,SWT.BORDER);

Label inputLabel=new Label(com,SWT.NONE);
inputLabel.setText("输入网址:");
inputLabel.setBounds(5, 10, 60, 20);

locationText=new Text(com,SWT.BORDER);
locationText.setBounds(70, 10, 300, 20);

goButton = new Button(com, SWT.PUSH);
goButton.setText("进入");
goButton.setBounds(500, 10, 50, 20);
goButton.addSelectionListener(new SelectionAdapter() {
      public void widgetSelected(SelectionEvent event)
      {
    
 Shell shell2 = createShell(display);
  Browser browser = createBrowser(shell2);
  locationText=locationText;
  System.out.println("0010"+locationText.getText());
       initialize(display,browser );
       browser.setUrl(locationText.getText());
      }
    });
return com;
}
public Shell createShell(final Display display)
{

    Shell   shell=new Shell(display);
    shell.setLayout(new FormLayout());
    createMenuBar(shell);
    createToolBar(shell);
    Composite com =this.createAddressBar(shell);
    com.setBounds(5, 10, 100, 20);
    FormData data = new FormData();
    data.top= new  FormAttachment(shell,20); 
    data.left = new FormAttachment(0, 5); 
   // data.bottom = new FormAttachment(10, -5); 
    data.right = new FormAttachment(100, -5);
    com.setLayoutData(data);
    return shell;
}
public Browser createBrowser(Shell shell)
{
Browser browser = new Browser(shell, SWT.NONE);

 FormData formData=new FormData();   
      
         formData.top= new  FormAttachment(com,50); 
         formData.left = new FormAttachment(0, 5); 
         formData.bottom = new FormAttachment(100, -5); 
         formData.right = new FormAttachment(100, -5);
       browser.setLayoutData(formData);   
         this.browser=browser;
         return browser;
}
public void initialize(final Display display,Browser browser )
{
        
          browser.addTitleListener(new org.eclipse.swt.browser.TitleListener() {   
              public void changed(org.eclipse.swt.browser.TitleEvent event) {  
               Browser browser = (Browser)event.widget;
             Shell  shell = browser.getShell();
               shell.setText(event.title);   
              }   
          });   
          browser.addOpenWindowListener(new org.eclipse.swt.browser.OpenWindowListener() {
              public void open( final org.eclipse.swt.browser.WindowEvent event) {
              
                      new Thread(){
                   public void run()
                   {
                   Display display=new Display();
                  
                     Shell shell=createShell(display);
                      Browser browser = createBrowser(shell);
                           
                            initialize(display,browser);
                            event.browser = browser;
                        
                        if (event.location != null) shell.setLocation(event.location);
                        if (event.size != null) {
                                Point size = event.size;
                                shell.setSize(shell.computeSize(size.x, size.y));
                        }
                        if (event.addressBar || event.menuBar || event.statusBar || event.toolBar) {
                                // Create widgets for the address bar, menu bar, status bar and/or tool bar
                                // leave enough space in the Shell to accommodate a Browser of the size
                                // given by event.size
                        }
                     
                        shell.open();
                        while (!shell.isDisposed()) 
                  { 
                  if (!display.readAndDispatch()) 
                 display.sleep(); 
                  } 
                  display.dispose(); 
                   }
                   }.start();
             
             
              }
          });
        
         
          browser.addVisibilityWindowListener(new org.eclipse.swt.browser.VisibilityWindowListener() {
          
           public void hide(WindowEvent event) {
                    Browser browser = (Browser)event.widget;
                    Shell shell = browser.getShell();
                    shell.setVisible(false);
            }
            public void show(final WindowEvent event) {
            
              Browser browser = (Browser)event.widget;
                 Shell shell = browser.getShell();
                 event.browser=browser;
                 if (event.location != null) shell.setLocation(event.location);
                 if (event.size != null) {
                         Point size = event.size;
                         shell.setSize(shell.computeSize(size.x, size.y));
                 }
                 if (event.addressBar || event.menuBar || event.statusBar || event.toolBar) {
                         // Create widgets for the address bar, menu bar, status bar and/or tool bar
                         // leave enough space in the Shell to accommodate a Browser of the size
                         // given by event.size
                 }
                 shell.open();
            }
      });
         
          browser.addCloseWindowListener(new CloseWindowListener() {
              public void close(WindowEvent event) {
                      Browser browser = (Browser)event.widget;
                      Shell shell = browser.getShell();
                      shell.close();
              }
      });
          //为浏览器注册地址改变事件   
        
          browser.addLocationListener(new org.eclipse.swt.browser.LocationListener() {   
               public void changing(org.eclipse.swt.browser.LocationEvent event) {   
            Browser browser = (Browser)event.widget;
              org.eclipse.swt.widgets.Shell shell = browser.getShell();
               Composite composite=createAddressBar(shell);
             Text locationText=new Text(composite,SWT.BORDER);
           locationText.setBounds(70, 10, 300, 20);
locationText.setText(event.location);
               
              
              }   
    
              public void changed(org.eclipse.swt.browser.LocationEvent e) {   
              }   
          });   
        
       
        
      }   
public static void main(String args[])
{
Browser1 browser1=new Browser1();
Display display=new Display();
Shell shell=browser1.createShell(display);
 
Browser browser = browser1.createBrowser(shell);
  
browser1.initialize(display,browser);
browser.setUrl("www.hao123.com");
  
shell.open();

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

解决方案 »

  1.   

       为什么不用SWT/Jface这样代码会减少一半。Jface封装了一部分Swt的类,这样代码看见来可观点,如果是学习SWT就无可厚非了.你这个问题可能是线程并发的问题。用线程异步调用的方法试试。
      

  2.   

     
    moshangmoxia
    谢谢哈!
      

  3.   

    我有一个问题请教,我们在用SWT 的 Browser时,由于嵌入的页面有AJAX定时线程(每5秒发一个请求),当Browser销毁时,线程还在跑,怎么办?