如果我使用com.apple.eawt.Application;
进行最低限度的实例化,就像这样:
Application app = Application.getApplication ()
默认的Mac应用程序菜单行为不当。
下面的最小可运行测试代码在启动时显示“Hello World”shell,并且只显示默认的应用程序菜单,标记为“SWT”。
如果没有应用程序,选择“退出”(或按Command-Q键)会正常退出程序。
使用应用程序,选择“退出”(或按Command-Q键)似乎正常退出程序(例如shell消失),但标有“SWT”的菜单仍然可见。它不会武装,也不会选择。根据IDE(Idea),我的测试程序仍在运行,必须通过IDE终止。
在我的环境中,使用下面的测试代码可以100%重现。
import com.apple.eawt.Application;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
public class AboutTester
{
public static void main ( String[] args )
{
Display display = new Display ();
Shell shell = new Shell ( display );
shell.setSize ( 300, 200 );
shell.setLayout ( new FillLayout () );
// Comment out the following line - problem goes away.
Application app = Application.getApplication ();
Label label = new Label ( shell, SWT.BORDER_SOLID );
label.setText ( "Hello World" );
shell.open ();
while ( !shell.isDisposed () )
{
if ( !display.readAndDispatch () )
display.sleep ();
}
display.dispose ();
}
}
当然,无法访问com.apple.eawt.Application;
对Mac来说是一个很大的障碍。
有谁知道这个问题的解决方案?
完全披露:我认为可能发生的事情(来自其他观察)是应用程序正在生成一个菜单,然后SWT用SWT生成的菜单覆盖。附加AboutHandler()附加到应用程序生成的菜单 - 因此在使用最顶层的SWT生成菜单时似乎不起作用。当SWT菜单退出时,它将应用程序生成的菜单作为孤儿留下。我的测试应用程序不知道如何清理此应用程序生成的菜单,因此挂起。但这是猜测。
Mac OS X 10.6.8(10K549)
org.eclipse.swt.cocoa.macosx.x86_64_3.7.0.v3735b.jar
org.eclipse.swt_3.7.1.v3738a.jar
(忍者编辑错别字)
答案 0 :(得分:0)
我看到完全相同的问题,我认为这可能是一个线程问题。如果你想在mac上有自定义菜单,那么请查看使用这个文件来处理来自Eclipse SWT端https://github.com/ajdaniel/tvrenamer/blob/devel/src/main/com/google/code/tvrenamer/view/CocoaUIEnhancer.java的那些东西。