2012-05-14 110 views
3

對,所以我有一個有趣的問題,關於在運行java 1.7的mac上SWT和swing集成。我試圖嵌入一個SWT瀏覽器小部件到我的swing項目作爲一個面板,這是非常簡單的Java版本1.6。已經有一些職位的解釋如何與SWT_AWT橋類與下面的例子沿着做到這一點:使用這顯然需要是SWT的3.8M5,可可的MacOSX-x86_64的JAR文件SWT瀏覽器 - Swing集成 - Mac - JDK 1.7

import java.awt.BorderLayout; 
import java.awt.Canvas; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.awt.SWT_AWT; 
import org.eclipse.swt.browser.Browser; 
import org.eclipse.swt.layout.GridData; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 

public class MySWTBrowserTest implements ActionListener { 

public JButton addCodeButton; 
public JButton launchBrowserButton; 
public JTextField inputCode; 
public JFrame frame; 
static Display display; 
static boolean exit; 

public MySWTBrowserTest() { 
    frame = new JFrame("Main Window"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    JPanel mainPanel = new JPanel(); 
    mainPanel.setLayout(new FlowLayout()); 

    inputCode = new JTextField(15); 
    inputCode.setText("999"); 
    addCodeButton = new JButton("Add Code"); 
    addCodeButton.addActionListener(this); 
    addCodeButton.setActionCommand("addcode"); 

    launchBrowserButton = new JButton("Launch Browser"); 
    launchBrowserButton.addActionListener(this); 
    launchBrowserButton.setActionCommand("launchbrowser"); 

    mainPanel.add(inputCode); 
    mainPanel.add(addCodeButton); 
    mainPanel.add(launchBrowserButton); 

    frame.getContentPane().add(mainPanel, BorderLayout.CENTER); 
    frame.pack(); 
    frame.setVisible(true); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 
    if (e.getActionCommand().equals("addcode")) { 
    } else if (e.getActionCommand().equals("launchbrowser")) { 
     createAndShowBrowser(); 
    } 

} 

public void createAndShowBrowser() { 
    JFrame f = new JFrame(); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    final Canvas canvas = new Canvas(); 
    f.setSize(850, 650); 
    f.getContentPane().add(canvas); 
    f.setVisible(true); 
    display.asyncExec(new Runnable() { 

     @Override 
     public void run() { 
      Shell shell = SWT_AWT.new_Shell(display, canvas); 
      shell.setSize(800, 600); 
      Browser browser = new Browser(shell, SWT.NONE); 
      browser.setLayoutData(new GridData(GridData.FILL_BOTH)); 
      browser.setSize(800, 600); 
      browser.setUrl("http://www.google.com"); 
      shell.open(); 
     } 
    }); 
} 

public static void main(String args[]) { 
    //SWT_AWT.embeddedFrameClass = "sun.lwawt.macosx.CEmbeddedFrame"; 
    display = new Display(); 

    EventQueue.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      MySWTBrowserTest mySWTBrowserTest = new MySWTBrowserTest(); 
     } 
    }); 

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

林包括運行上述示例。當使用兩個32位和1.6 JDK的64個版本,這個運行完全正常,但在切換到JDK 1.7或1.8 VM時可再現錯誤被拋出:

2012-05-14 15:11:30.534 java[1514:707] Cocoa AWT: Apple AWT Java VM was loaded on first thread -- can't start AWT. (
0 liblwawt.dylib      0x00000008db728ad0 JNI_OnLoad + 468 
1 libjava.dylib      0x00000001015526f1 Java_java_lang_ClassLoader_00024NativeLibrary_load + 207 
2 ???         0x00000001015a4f90 0x0 + 4317663120 
) 
_NSJVMLoadLibrary: NSAddLibrary failed for /libjawt.dylib 
JavaVM FATAL: lookup of function JAWT_GetAWT failed. Exit 
Java Result: 255 

伊夫檢查了java 1.7 VM和確實在那裏找到了這些庫,所以Im努力去查看可能導致它不加載該庫的原因。當然,我確保使用:-XstartOnFirstThread作爲VM參數之一,如SWING/AWT集成所需。

在進一步的說明中,我已經嘗試過DJ Native Widgets框架,它會引發完全相同的錯誤,因爲它也使用底層的SWT框架。

爲了重現這種效果,我建議在mac上安裝JDK 1.7(不是開發者預覽版),下載:http://www.eclipse.org/downloads/download.php?file=/eclipse/downloads/drops4/S-4.2M7-201205031800/swt-S-4.2M7-201205031800-cocoa-macosx-x86_64.zip來獲取庫,然後使用-XstartOnFirstThread -d64 java 1.7 vm運行它。

真的希望有人能排序了這一點作爲我確信我不是唯一一個試圖在1.7 VM

SWT融入擺動我也花了8小時谷歌,看看這個錯誤已被複制到其他任何地方,它已經出現在幾個Matlab郵件列表中,但除此之外,我還無法找到與解決方案相近的東西。

在此先感謝。


>>更新1

看起來我們可以有一個贏家:https://bugs.eclipse.org/bugs/show_bug.cgi?id=374199 去監控這個問題,看看哪裏就有奇蹟。

>>更新2

這裏是一個工作示例:https://stackoverflow.com/a/27754819/363573

+2

好問題!!在Mac上有與OpenGL(JOGL)相同的問題...太糟糕了,我們絕對沒有辦法做到!改變工作空間的默認編譯器和JRE爲1.6 ... –

+1

不,你不能認真的說:(我在D之前多次使用JOGL:所以這肯定是一件新事物......它已經差不多一年了,而且這個問題仍然沒有被修復#frustrating –

+0

我使用JOGL通過它的SWT Canvas實現,我認爲這是問題...我更喜歡SWT因爲我的整個UI是SWT,而且我也害怕HATE Swing和AWT!我可以和蠑螈一起去,但我懶得試試! –

回答

2

不幸的是有沒有好的答案。在Java 7中,AWT已被完全重寫爲使用CoreAnimation圖層。 SWT假定AWT Canvas將由NSView支持,但現在不再是這種情況。您現在唯一的選擇就是堅持使用Java 6.

AWT團隊知道這個問題,但您可能想要在bugs.sun.com上提交另一個錯誤。

+0

非常感謝您的回答斯科特,虐待一定要將此文件作爲一個錯誤。非常感謝。 –

+0

錯誤報告:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7182511 –

+0

只是對原始問題進行了更新,我們可能會根據提供的鏈接修復此問題。 –