2013-05-14 44 views
7

Display.getActiveShell() dường như chỉ xem xét Shell hoạt động nếu nó tập trung. Nếu tại thời điểm này ứng dụng khác có tiêu điểm có nghĩa là Display.getActiveShell() sẽ trả về null.Nhận Active Shell trong SWT, ngay cả khi Shell không nằm trên tiêu điểm

Tôi cần một phương pháp luôn cho tôi biết Shell đang tập trung vào ứng dụng SWT của tôi, ngay cả khi ứng dụng SWT của tôi không tập trung.

tôi đã nhanh chóng bị hack đoạn mã này với nhau, mặc dù đôi khi tôi nhận được một 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; 
} 

Có cách nào tiêu chuẩn để tiếp cận vấn đề này khác hơn là viết phương pháp riêng của bạn?

+0

_ "Tôi cần một phương pháp luôn cho tôi biết Shell đang tập trung vào ứng dụng SWT của tôi, ngay cả khi ứng dụng SWT của tôi không tập trung." _ Phần thứ hai là mâu thuẫn đầu tiên. Bạn có thể làm rõ? – Baz

+0

Một điều là phải có một vỏ tập trung vào bối cảnh của ứng dụng của tôi, một điều nữa là để có ứng dụng swt của tôi tập trung! –

+0

Không có trọng tâm trong ứng dụng của bạn nếu bản thân ứng dụng không có tiêu điểm. – Baz

Trả lời

8

Gần đây, tôi đã gặp sự cố tương tự và mặc dù bạn có thể đã tìm thấy giải pháp trong khi đó tôi muốn chia sẻ tài nguyên của tôi để tham khảo trong tương lai.

ShellActivationTracker thêm bộ lọc hiển thị nghe các sự kiện Activate và - nếu tiện ích được kích hoạt là Shell - nhớ kích hoạt gần đây nhất Shell. Vì vậy, bạn có thể truy vấn vỏ hoạt động (cuối cùng) ngay cả khi ứng dụng của bạn hiện không hoạt động/tập trung.

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; 
     } 
    } 
    }