先上代码import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.browser.OpenWindowListener;
import org.eclipse.swt.browser.ProgressEvent;
import org.eclipse.swt.browser.ProgressListener;
import org.eclipse.swt.browser.WindowEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;public class Window extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel panel;
private JButton b1 = new JButton("GO"),
b2 = new JButton("Add Data");
private JTextField textField = new JTextField(50);
static String path = "http://www.baidu.com";
static final Display display = Display.getDefault();
static Canvas canvas = null;
static Shell shell;
static Browser browser = null;

public Window() {
System.setProperty("sun.awt.xembedserver", "true");
canvas = new Canvas() {
private static final long serialVersionUID = 1L;
@Override
public void addNotify() {
super.addNotify();
final Canvas canvas_ = this;
display.asyncExec(new Runnable() {
public void run() {
shell = SWT_AWT.new_Shell(display, canvas);
shell.setText("Slashdot");
shell.setLayout(new FillLayout());
browser = new Browser(shell, SWT.NONE);
browser.addProgressListener(new ProgressListener() {
public void changed(ProgressEvent event) {
} public void completed(ProgressEvent event) {
/*String script = "var a = new Array();" +
"a = document.getElementsByTagName(\"a\");" +
"for(i = 0; i < a.length; i++) {" +
"a[i].target = '_self';" +
"}";
browser.execute(script);*/
System.out.println("网页加载完成!");
}
});
browser.addOpenWindowListener(new OpenWindowListener() {
@Override
public void open(WindowEvent event) {
final Browser browser2 = new Browser(shell, SWT.NONE);
event.browser = browser2;
event.display.asyncExec(new Runnable() {
@Override
public void run() {
browser.setUrl(browser2.getUrl());
}
});
}

});
browser.setUrl(path);
browser.setVisible(true);
shell.setSize(canvas_.getWidth(), canvas_.getHeight());
shell.open();
while(!shell.isDisposed()){
if(!display.readAndDispatch()){
display.sleep();
}
}
}
});
}
};
panel = new JPanel();
panel.setLayout(new FlowLayout());
panel.add(textField);
b1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
path = textField.getText();
display.asyncExec(new Runnable() {
public void run() {
browser.setUrl(path);
}
});
}

});
panel.add(b1);
add(BorderLayout.NORTH, panel);
add(BorderLayout.CENTER, canvas);
setSize(800, 600);
ImageIcon ii = new ImageIcon(this.getClass().getResource("image/debug_wiz.png")); 
setIconImage(ii.getImage());
setTitle("swt嵌入swing");
setBounds(200, 200, 800, 600);
setVisible(true);
}

static Window window;

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
window = new Window();
}
});
while(true){
if(!display.readAndDispatch()){
display.sleep();
}
}
}
}
问题就是,我这么做在关闭窗口的时候,窗口虽然关闭了,但是这个类还在运行,具体可以运行下试试。我要怎么做才能正确的关闭呢。

解决方案 »

  1.   

    你在Window()构造方法的最后添加一行
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    试试行不行
      

  2.   

    附带给刚学习SWT的同学说下,这个程序要跑的话需要swt-awt-win32.dll,将这个文件放到classpath当中,否则会报错import java.awt.BorderLayout;
    import java.awt.Canvas;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    import javax.swing.SwingUtilities;import org.eclipse.swt.SWT;
    import org.eclipse.swt.awt.SWT_AWT;
    import org.eclipse.swt.browser.Browser;
    import org.eclipse.swt.browser.OpenWindowListener;
    import org.eclipse.swt.browser.ProgressEvent;
    import org.eclipse.swt.browser.ProgressListener;
    import org.eclipse.swt.browser.WindowEvent;
    import org.eclipse.swt.layout.FillLayout;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;public class Window extends JFrame {
        private static final long serialVersionUID = 1L;
        private JPanel panel;
        private JButton b1 = new JButton("GO"),
                        b2 = new JButton("Add Data");
        private JTextField textField = new JTextField(50);
        static String path = "http://www.baidu.com";
        static final Display display = Display.getDefault();
        static Canvas canvas = null;
        static Shell shell;
        static Browser browser = null;    public Window() {
            System.setProperty("sun.awt.xembedserver", "true");
            canvas = new Canvas() {
                private static final long serialVersionUID = 1L;
                @Override
                public void addNotify() {
                    super.addNotify();
                    final Canvas canvas_ = this;
                    display.asyncExec(new Runnable() {
                        public void run() {
                            shell = SWT_AWT.new_Shell(display, canvas);
                            shell.setText("Slashdot");
                            shell.setLayout(new FillLayout());
                            browser = new Browser(shell, SWT.NONE);
                            browser.addProgressListener(new ProgressListener() {
                                public void changed(ProgressEvent event) {
                                }                            public void completed(ProgressEvent event) {
                                    /*String script = "var a = new Array();" +
                                                    "a = document.getElementsByTagName(\"a\");" +
                                                    "for(i = 0; i < a.length; i++) {" +
                                                    "a[i].target = '_self';" +
                                                    "}";
                                    browser.execute(script);*/
                                    System.out.println("网页加载完成!");
                                }
                            });
                            browser.addOpenWindowListener(new OpenWindowListener() {
                                @Override
                                public void open(WindowEvent event) {
                                    final Browser browser2 = new Browser(shell, SWT.NONE);
                                    event.browser = browser2;
                                    event.display.asyncExec(new Runnable() {
                                        @Override
                                        public void run() {
                                            browser.setUrl(browser2.getUrl());
                                        }
                                    });
                                }                        });
                            browser.setUrl(path);
                            browser.setVisible(true);
                            shell.setSize(canvas_.getWidth(), canvas_.getHeight());
                            shell.open();
                            while(!shell.isDisposed()){
                                if(!display.readAndDispatch()){
                                    display.sleep();
                                }
                            }
                        }
                    });
                }
            };
            panel = new JPanel();
            panel.setLayout(new FlowLayout());
            panel.add(textField);
            b1.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    path = textField.getText();
                    display.asyncExec(new Runnable() {
                        public void run() {
                            browser.setUrl(path);
                        }
                    });
                }        });
            panel.add(b1);
            add(BorderLayout.NORTH, panel);
            add(BorderLayout.CENTER, canvas);
            setSize(800, 600);
            ImageIcon ii = new ImageIcon(this.getClass().getResource("thu.jpg"));
            setIconImage(ii.getImage());
            setTitle("swt嵌入swing");
            setBounds(200, 200, 800, 600);
            setVisible(true);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }    static Window window;    public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    window = new Window();
                }
            });
            while(true){
                if(!display.readAndDispatch()){
                    display.sleep();
                }
            }    }
    }
      

  3.   

    我也再提醒下大家,这个程序要跑的话除了要有swt-awt-win32.dll还要在Window这个目录下有一个image目录里面有一张图片叫debug_wiz.png当然你可以改一下下面两句。去掉也行。 ImageIcon ii = new ImageIcon(this.getClass().getResource("image/debug_wiz.png")); 
     setIconImage(ii.getImage());