對,所以我有一個有趣的問題,關於在運行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
好問題!!在Mac上有與OpenGL(JOGL)相同的問題...太糟糕了,我們絕對沒有辦法做到!改變工作空間的默認編譯器和JRE爲1.6 ... –
不,你不能認真的說:(我在D之前多次使用JOGL:所以這肯定是一件新事物......它已經差不多一年了,而且這個問題仍然沒有被修復#frustrating –
我使用JOGL通過它的SWT Canvas實現,我認爲這是問題...我更喜歡SWT因爲我的整個UI是SWT,而且我也害怕HATE Swing和AWT!我可以和蠑螈一起去,但我懶得試試! –