2013-04-05 86 views
1

這無疑是一個微不足道的問題,但我似乎無法弄清楚我做錯了什麼。情況非常簡單:我有一個應用程序創建一個額外的對話窗口向用戶顯示一些內容。主應用程序有一個帶有鍵盤快捷鍵的菜單項的菜單欄。當我使用鍵盤快捷方式調用菜單項時,主程序創建新窗口,則當用戶關閉新窗口並再次顯示主應用程序時,菜單欄項目保持高亮顯示/「打開「看。複製我所看到的在Mac OS使用SWT 4.2的代碼是這樣的:Java SWT菜單欄項目在創建子框架後「卡住」

import org.eclipse.swt.SWT; 
import org.eclipse.swt.events.SelectionAdapter; 
import org.eclipse.swt.events.SelectionEvent; 
import org.eclipse.swt.layout.FillLayout; 
import org.eclipse.swt.widgets.Button; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Menu; 
import org.eclipse.swt.widgets.MenuItem; 
import org.eclipse.swt.widgets.Shell; 

public class tester 
{ 
    public static void createShell(Shell parent) { 
     final Shell newShell = new Shell(parent, SWT.DIALOG_TRIM | SWT.RESIZE); 
     newShell.setSize(100,100); 
     newShell.setLayout(new FillLayout()); 

     Button closeButton = new Button(newShell, SWT.NONE); 
     closeButton.setText("Close"); 
     closeButton.addSelectionListener(new SelectionAdapter() { 
      @Override 
      public void widgetSelected(SelectionEvent arg0) { 
       newShell.close(); 
      } 
     }); 

     newShell.open(); 
    } 

    public static void main(String[] args) { 
     Display display = new Display(); 
     final Shell shell = new Shell(display); 
     shell.setLayout(new FillLayout()); 
     shell.setSize(200, 100); 

     Menu menuBar = new Menu(shell, SWT.BAR); 
     shell.setMenuBar(menuBar); 

     MenuItem item = new MenuItem(menuBar, SWT.CASCADE); 
     item.setText("Foo"); 

     Menu fooMenu = new Menu(item); 
     item.setMenu(fooMenu); 

     MenuItem barMenu = new MenuItem(fooMenu, SWT.NONE); 
     barMenu.setText("Menu item"); 
     barMenu.setAccelerator(SWT.MOD1 + 'F'); 
     barMenu.addSelectionListener(new SelectionAdapter() { 
      @Override 
      public void widgetSelected(SelectionEvent arg0) { 
       createShell(shell); 
      } 
     }); 

     shell.open(); 
     while (!shell.isDisposed()) { 
      if (!display.readAndDispatch()) { 
       display.sleep(); 
      } 
     } 
     display.dispose(); 
    } 
} 

複製的問題,運行上面的程序,從鍵盤調用命令-F,然後點擊「關閉」按鈕在創建的窗口中。它會關閉第二個窗口並返回到原始窗口。這裏是什麼樣子後,我做的一個例子:

screenshot

的問題是「富」如何保持突出顯示。我希望它不會突出顯示。事實上,它確實而不是保持高亮,如果我拉下菜單並選擇菜單項,所以有一些具體的關於使用鍵盤快捷鍵,導致這一點,但我在我的智慧'結束試圖找出那可能是什麼。

有人可以告訴我我做錯了什麼嗎?

回答

1

我看不出任何錯誤的代碼。所以剩下的就是解決這個問題。雖然這表明黑客,它確實工作。這個想法將延遲執行到稍晚的時間,但不要太晚,但要等待足夠的時間,以完成事件並停用該項目。使用Display.getDefault().asyncExec()的第一個測試沒有按預期工作,所以我嘗試了invokeLaterasyncExec的組合,但那不會。在這一點上,我選擇了一把錘子,並稱爲Thread.currentThread().sleep()結合上述,這似乎工作得很好。

所有這一切都需要改變的是barMenu像這樣的SelectionAdapter

barMenu.addSelectionListener(new SelectionAdapter() { 
     @Override 
     public void widgetSelected(SelectionEvent arg0) { 
      // invoke later to give event time to finish, and have 
      // the menu item deselected 
      javax.swing.SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
       // wait 
       try { Thread.currentThread().sleep(100);} catch(Exception ex){} 
       // jump back to the SWT thread and do the actual work 
       Display.getDefault().asyncExec(new Runnable() { 
       public void run() { 
       createShell(shell); 
       }}); 
      }}); 
     } 
    }); 
+0

良好的偵探工作:-)。謝謝!我可以證實這個作品。 – mhucka 2013-04-05 21:44:25