SWT_AWT桥 - SWT中的Swing问题

时间:2010-09-20 06:40:36

标签: java swing swt

我想将浏览器嵌入到Frame.I中写道

public class MyBrowser{ 

   public static void main(String[] args) 
   { 
       final Display display = Display.getDefault(); 

       Frame frm = new Frame("MyBrowser"); 
       Canvas embedded = new Canvas(); 
       frm.add(embedded, BorderLayout.CENTER); 

       frm.pack(); 

       final Shell composite = SWT_AWT.new_Shell(display, embedded); 
       composite.setLayout(new FillLayout(SWT.VERTICAL)); 
       final Browser browser = installBrowser(composite, "http://www.baidu.com"); 
       frm.addWindowListener(new WindowAdapter() 
       { 
           public void windowClosing(WindowEvent e) 
           { 
           e.getWindow().dispose(); 
           //composite.dispose(); 
//            display.dispose(); 
           } 
       }); 

       JTextField addr = new JTextField(80); 
       addr.addActionListener(new ActionListener() 
       { 
           public void actionPerformed(final ActionEvent e) 
           { 
               display.syncExec(new Runnable() 
               { 
                   public void run() 
                   { 
                       browser.setUrl(((JTextComponent) e.getSource()).getText()); 
                   } 
               }); 
           } 
       }); 
       frm.add(addr, BorderLayout.NORTH); 

       frm.setSize(800, 600); 
       frm.setVisible(true); 
       while (frm.isDisplayable()) 
           if (!display.readAndDispatch()) 
               display.sleep(); 
//       display.dispose(); 
   } 

   public static Browser installBrowser(Composite parent, String homeURL) 
   { 
       Browser browser = new Browser(parent, SWT.EMBEDDED); 
       browser.setUrl(homeURL); 
       return browser; 
   } 
} 
  1. 在Windows上运行,
  2. 在Linux上,这座桥看起来很有效,但没有任何东西可见。所以我想知道如何让它在linux上运行。

3 个答案:

答案 0 :(得分:3)

将sun.awt.xembedserver设置为true https://bugs.eclipse.org/bugs/show_bug.cgi?id=161911

答案 1 :(得分:0)

SWT在很大程度上取决于本地库。仔细检查您是否为这两个操作系统使用了不同且正确的版本。

仔细检查Linux系统上是否安装了Mozilla(Firefox)。 SWT.Browser绑定到本机HTML呈现引擎(Windows上的Explorer,Linux系统上的Mozilla)。

最后:查看SWT常见问题解答:What do I need to run the SWT Browser inside Eclipse on Linux?

答案 2 :(得分:0)

如果我只是运行swt brower并且不将它嵌入画布中。它可以在linux中显示网页。所以我虽然问题出在SWT_AWT桥上。 我的代码附在下面:

public class BrowserClass {
  public static void main(String[] args) {
    Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setText("Browser Example");
    shell.setSize(620, 500);

    ToolBar toolbar = new ToolBar(shell, SWT.NONE);
    toolbar.setBounds(5, 5, 200, 30);

    ToolItem goButton = new ToolItem(toolbar, SWT.PUSH);
    goButton.setText("Go");

    ToolItem backButton = new ToolItem(toolbar, SWT.PUSH);
    backButton.setText("Back");

    ToolItem stopButton = new ToolItem(toolbar, SWT.PUSH);
    stopButton.setText("Stop");

    final Text text = new Text(shell, SWT.BORDER);
    text.setBounds(5, 35, 400, 25);

    final Browser browser = new Browser(shell, SWT.NONE);
    browser.setBounds(5, 75, 600, 400);

    Listener listener = new Listener() {
      public void handleEvent(Event event) {
        ToolItem item = (ToolItem) event.widget;
        String string = item.getText();
        if (string.equals("Back"))
          browser.back();
        else if (string.equals("Stop"))
          browser.stop();
        else if (string.equals("Go"))
          browser.setUrl(text.getText());
      }
    };

    goButton.addListener(SWT.Selection, listener);
    backButton.addListener(SWT.Selection, listener);
    stopButton.addListener(SWT.Selection, listener);

    text.addListener(SWT.DefaultSelection, new Listener() {
      public void handleEvent(Event e) {
        browser.setUrl(text.getText());
      }
    });

    shell.open();
    browser.setUrl("http://www.google.com");
    while (!shell.isDisposed()) {
      if (!display.readAndDispatch())
        display.sleep();
    }
    display.dispose();
  }

它可以打开谷歌网站。但是,如果我使用SWT_AWT.new_Shell方法。不行。 我不能在其中嵌入一个swt按钮。

我的环境是:mozilla 1.7.7
gtk:gtk2-2.2.4-19
linux:Red Hat Enterprise Linux ES版本3(Taroon Update 8)
uname -a
2.4.21-47.ELsmp#1 SMP Wed Jul 5 20:38:41 EDT 2006 i686 i686 i386 GNU / Linux