java swing 内置浏览器打开网页显示flash图表-swt Browser应用

今天在网上找了好久如何用在java swing打开网页,从而实现显示网页图表的效果,功夫不负有心人,终于搞定了,下面把所用的类和swt.jar整理了一下,方便有需要的朋友使用。

用到的swt.jar下载

调用网页的Browser要结合现有的java控件使用,一下是结合panel定义的类(SWTPane.java):

 

 /* 
  * To change this template, choose Tools | Templates 
  * and open the template in the editor. 
  */  
 package desktopapplicationmenu.comm;  
   
 import java.awt.BorderLayout;  
 import java.awt.Canvas;  
 import java.awt.Panel;  
 import org.eclipse.swt.SWT;  
 import org.eclipse.swt.awt.SWT_AWT;  
 import org.eclipse.swt.browser.Browser;  
 import org.eclipse.swt.layout.FillLayout;  
   
 import org.eclipse.swt.widgets.Display;  
 import org.eclipse.swt.widgets.Shell;  
   
 /** 
  * 
  * @author liujl 
  */  
 public class SWTPane extends Panel {  
   
     DisplayThread displayThread;  
     private Canvas canvas;  
   
     public SWTPane() {  
         displayThread = new DisplayThread();  
         displayThread.start();  
         canvas = new Canvas();  
         setLayout(new BorderLayout());  
         add(canvas, BorderLayout.CENTER);  
     }  
  public static void main(String args[]) throws Exception {  
   
      java.awt.EventQueue.invokeLater(new Runnable() {  
   
             public void run() {  
                 new SWTPane().setVisible(true);  
             }  
         });  
        
  }  
     public void addNotify() {  
         super.addNotify();  
         Display dis = displayThread.getDisplay();  
         dis.syncExec(new Runnable() {  
   
             public void run() {  
                 Shell shell = SWT_AWT.new_Shell(displayThread.getDisplay(), canvas);  
                 shell.setLayout(new FillLayout());  
                 final Browser browser = new Browser(shell, SWT.NONE);  
                 browser.setLayoutData(BorderLayout.CENTER);  
                 browser.setUrl("http://www.my400800.cn");  
             }  
         });  
     }  
 }  


 

里面为了防止在打开网页的时候出现错误,封装了一下Thread类,定义如下(DisplayThread.java):

 

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package desktopapplicationmenu.comm;

import org.eclipse.swt.widgets.Display;

/**
 *
 * @author liul
 */
public class DisplayThread extends Thread {

    private Display display;
    Object sem = new Object();

    public void run() {
        synchronized (sem) {
            display = Display.getDefault();
            sem.notifyAll();
        }
        swtEventLoop();
    }

    private void swtEventLoop() {
        while (true) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    public Display getDisplay() {
        try {
            synchronized (sem) {
                while (display == null) {
                    sem.wait();
                }
                return display;
            }
        } catch (Exception e) {
            return null;
        }
    }
}

调用方法

        SWTPane jbtn_Sel = new SWTPane();
        jPanel1.add(jbtn_Sel);
        jbtn_Sel.setBounds(1, 1, 600, 600);


posted @ 2011-02-25 16:48  ljlxyf  阅读(2030)  评论(0编辑  收藏  举报