2013-05-14 9 views
7

Display.getActiveShell(), yalnızca bir Kabuğun odaklandığı sürece etkin olduğunu düşünür. Şu anda başka bir uygulama varsa Display.getActiveShell()null döndürür.Aktif Kabuk SWT'ye alın, ancak Kabuk odakta olmasa bile,

SWT uygulamamın odakta olmasa bile, SWT uygulamasına odaklanan Shell'in hangisi olduğunu her zaman bana söyleyecek bir yönteme ihtiyacım var. Bazen almak rağmen

ben çabuk bir araya kod parçası kesmek ettik bir AssertionException:

public static Shell getActiveShell() { 
    Display display = Display.getDefault(); 
    Shell result = display.getActiveShell(); 

    if (result == null) { 
     Shell[] shells = display.getShells(); 
     for (Shell shell : shells) { 
      if (shell.getShells().length == 0) { 
       if (result != null) 
        throw new AssertionException(); 
       result = shell; 
      } 
     } 
    } 

    return result; 
} 

kendi yöntemi yazma dışında bu sorunu yaklaşmak için herhangi bir standart yolu var mı?

+0

_ "Ben her zaman SWT uygulama odakta olmadığında bile, benim SWT uygulamaya odakta Shell hangi söyle edecek bir yöntem gerekir." _ Ikinci kısım birinci çeliştiğini göstermektedir. Açıklayabilir misin? – Baz

+0

Uygulamamın içeriğine odaklanan bir kabuğa sahip olmak, başka bir şey benim swt uygulamasına odaklanmaktır! –

+0

Uygulamanın kendisinde odak yoksa, uygulamanızda odak yoktur. – Baz

cevap

8

Son zamanlarda benzer bir sorunla karşılaştım ve bu arada muhtemelen bir çözüm buldunuz, ancak gelecekte referans olarak kullanmak istiyorum. aktive Widget Shell ise - - En son Shell aktive hatırlar ShellActivationTracker

Activate olaylarını dinler ve bir görüntüleme filtresi ekler. Böylece, uygulamanız şu anda aktif/odaklı olmasa bile (son) aktif kabuğu sorgulayabilirsiniz.

class ShellActivationTracker implements Listener { 
    Shell activeShell; 

    ShellActivationTracker(Display display) { 
     activeShell = display.getActiveShell(); 
     display.addFilter(SWT.Activate, this); 
    } 

    @Override 
    public void handleEvent(Event event) { 
     if(event.widget instanceof Shell) { 
     activeShell = (Shell)event.widget; 
     } 
    } 
    }