我正在尝试使用Swing实现web浏览器。下面是代码。
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.Insets;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import chrriis.dj.nativeswing.swtimpl.NativeInterface;
import chrriis.dj.nativeswing.swtimpl.components.JWebBrowser;
public class WebPageDisplay extends JPanel{
public WebPageDisplay() {
super(new BorderLayout());
try{
NativeInterface.open();
JPanel webBrowserPanel = new JPanel(new BorderLayout());
final JWebBrowser webBrowser = new JWebBrowser();
webBrowser.setBarsVisible(false);
webBrowser.setStatusBarVisible(true);
webBrowserPanel.add(webBrowser, BorderLayout.CENTER);
add(webBrowserPanel, BorderLayout.CENTER);
webBrowser.navigate("www.google.com);
JScrollPane scrollPane = new JScrollPane();
Dimension preferredSize = scrollPane.getPreferredSize();
preferredSize.height += 20;
scrollPane.setPreferredSize(preferredSize);
add(scrollPane,new GridBagConstraints(0, 2, 2, 1, 1.0, 1.0, GridBagConstraints.CENTER,
GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
WebPageDisplay display = new WebPageDisplay();
}
}我在异常下面。
On Mac, "NativeInterface.initialize()"/"NativeInterface.open()" should not be called after AWT static initializers have run, otherwise there can be all sorts of side effects (non-functional modal dialogs, etc.). Generally, the problem is when the "main(String[])" method is located inside an AWT component subclass and the fix is to move that main method to a standalone class. The problematic class here is "WebPageDisplay"
***WARNING: Display must be created on main thread due to Cocoa restrictions.
2012-09-17 22:48:04.943 java[248:407] _createMenuRef called with existing principal MenuRef already associated with menu
2012-09-17 22:48:05.134 java[248:407] (
0 CoreFoundation 0x00007fff96568286 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff9244dd5e objc_exception_throw + 43
2 CoreFoundation 0x00007fff965680ba +[NSException raise:format:arguments:] + 106
3 CoreFoundation 0x00007fff96568044 +[NSException raise:format:] + 116
4 AppKit 0x00007fff8fea7597 -[NSCarbonMenuImpl _createMenuRef] + 64
5 AppKit 0x00007fff8fea6e82 -[NSCarbonMenuImpl _instantiateCarbonMenu] + 148
6 AppKit 0x00007fff8fe7bb43 -[NSApplication finishLaunching] + 878
7 libawt.jnilib 0x0000000106a6a157 -[NSApplicationAWT finishLaunching] + 641
8 libswt-pi-cocoa-3730.jnilib 0x00000001080f9eb2 Java_org_eclipse_swt_internal_cocoa_OS_objc_1msgSendSuper__Lorg_eclipse_swt_internal_cocoa_objc_1super_2J + 89
9 ??? 0x0000000102abdd6e 0x0 + 4339785070
)
java.lang.IllegalStateException: This call must happen in the AWT Event Dispatch Thread! Please refer to http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html and http://java.sun.com/javase/6/docs/api/javax/swing/SwingUtilities.html#invokeLater(java.lang.Runnable)
at chrriis.dj.nativeswing.swtimpl.core.MessagingInterface.checkUIThread(MessagingInterface.java:161)
at chrriis.dj.nativeswing.swtimpl.core.SWTNativeInterface.checkUIThread(SWTNativeInterface.java:475)
at chrriis.dj.nativeswing.swtimpl.core.SWTNativeComponent.runSync(SWTNativeComponent.java:184)
at chrriis.dj.nativeswing.swtimpl.components.core.NativeWebBrowser.navigate(NativeWebBrowser.java:728)
at chrriis.dj.nativeswing.swtimpl.components.JWebBrowser.navigate(JWebBrowser.java:315)
at chrriis.dj.nativeswing.swtimpl.components.JWebBrowser.navigate(JWebBrowser.java:305)
at WebPageDisplay.<init>(WebPageDisplay.java:31)
at WebPageDisplay.main(WebPageDisplay.java:54)我在我的类路径中使用了下面的jar。
DJNativeSwing-SWT.jar
DJNativeSwing.jar
swt-3.7M7-cocoa-macosx-x86_64.jar发布于 2012-09-18 01:52:55
您的错误消息将告诉您哪里出了问题:
在Mac上,"NativeInterface.initialize()"/"NativeInterface.open()“不应该在AWT静态初始化器运行后调用,否则可能会有各种副作用(非功能模式对话框等)。通常,问题是当" main (String[])“方法位于AWT组件子类中时,修复方法是将主方法移动到独立的类中。这里有问题的类是"WebPageDisplay“
您需要在事件调度线程EDT上启动GUI。但话虽如此,NativeInterface需要在主线程上启动,而不是在EDT上启动,然后才能在EDT上排队。根据NativeInterface API的open()方法部分:
如果接口尚未初始化,则会进行
初始化。如果没有显式地执行初始化,则应该在程序的早期调用此方法,最好的位置是作为main方法中的第一个调用。
因此,您的代码可能如下所示:
public static void main(String[] args){
// start your NativeInterface here!
NativeInterface.open(); // not sure what else may be needed for this
SwingUtilities.invokeLater(new Runnable() {
public void run() {
WebPageDisplay display = new WebPageDisplay();
}
});
}请注意,我没有也没有使用过NativeInterface库,因此无法测试此代码。
请注意,我看不到将图形用户界面组件添加到顶级窗口(如JFrame )的位置,因此我不确定如何显示图形用户界面。
发布于 2013-07-24 15:17:06
根据"Hover Full Of Eels“的说法,以下是我在Mac上的解决方案:
1-不使用main()方法,而是在主类的最开始处创建一个静态时钟,并将open()方法放在那里。
2-在你的main方法的末尾,runEventPump()方法,我认为大多数系统都需要这个方法。
public class Something {
static {
NativeInterface.open();
UIUtils.setPreferredLookAndFeel();
}
// ... (etc)
public static void main(String[] args) {
// ... (etc)
NativeInterface.runEventPump();
}
}https://stackoverflow.com/questions/12464524
复制相似问题