是的,所以我在这里遇到了一个有趣的问题,关于在运行java 1.7的mac上的SWT和swing集成。我试图将SWT浏览器小部件嵌入我的swing项目作为面板,这在java 1.6版上非常简单。有很多帖子解释了如何使用SWT_AWT桥接类以及以下示例:
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();
}
}
我正在使用swt-3.8M5-cocoa-macosx-x86_64 JAR文件,显然需要包含这些文件来运行上面的例子。当同时使用1.6 JDK的32位和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并且确实在那里找到了库,所以我很难看到可能导致它无法加载该库的原因。当然,我确保使用:-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运行它。
真的希望有人能够解决这个问题,因为我确信我并不是唯一一个试图将SWT整合到1.7 vm 的
的人我还花了8个小时在google上看看这个错误是否已经在其他任何地方重现了,并且它出现在一些Matlab邮件列表中,但除此之外我还没有找到一些甚至接近于溶液
提前致谢。
看起来我们可能有一个胜利者:https://bugs.eclipse.org/bugs/show_bug.cgi?id=374199 要监视它并查看它的去向。
答案 0 :(得分:2)
不幸的是,对此没有好的答案。在Java 7中,AWT已经完全重写为使用CoreAnimation层。 SWT假设AWT Canvas将由NSView支持但不再是这种情况。您现在唯一的选择就是坚持使用Java 6.
AWT团队意识到了这个问题,但您可能想在bugs.sun.com上提交另一个错误。