2012-09-30 50 views
0

如果我使用com.apple.eawt.Application;甚至最小的实例是这样的:apple.eawt.Application创建一个错误的菜单?

   Application app = Application.getApplication() 

默认的Mac应用程序菜单行为不端。

下面的最小运行测试代码在启动时显示“Hello World”外壳,并且只显示默认应用程序菜单,并按预期标记为“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

(忍者编辑的错别字)

回答