2012-01-12 48 views
8

Tôi đã được thông báo và có read rằng các đối tượng SWT phải được xử lý rõ ràng bằng cách gọi phương thức dispose của chúng tôi. Tuy nhiên, trong thử nghiệm của riêng tôi với mã sau đây, tôi đã lưu ý rằng ít nhất Shell s báo cáo mình là xử lý ngay cả khi phương pháp vứt bỏ không bao giờ được gọi (cũng không xuất hiện) bất cứ nơi nào trong mã của tôi.Tôi có cần thải bỏ SWT Shell một cách rõ ràng không?

import java.util.ArrayList; 
import java.util.List; 
import org.eclipse.swt.events.DisposeEvent; 
import org.eclipse.swt.events.DisposeListener; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 


    public class Test { 

     private static int numDisposals = 0; 
     private static List<Shell> shells = new ArrayList<Shell>(); 

    public static void main(String[] args) { 
     Display d = Display.getDefault(); 
     for (int i = 0; i < 3; i++) { 
      Shell s = new Shell(d); 
      shells.add(s); 
      s.setText(String.valueOf(i)); 
      s.open(); 
      s.addDisposeListener(new DisposeListener() { 

       @Override 
       public void widgetDisposed(DisposeEvent notUsed) { 
        numDisposals++; 
        printShellStatus(); 
       } 
      }); 
     } 
     while (numDisposals < 3) { 
      while (!d.readAndDispatch()) { 
       d.sleep(); 
      } 
     } 
     printShellStatus(); 
    } 

    public static void printShellStatus() { 
     System.out.println("Which shells are disposed?"); 
     for (Shell shell : shells) { 
      if (shell.isDisposed()) { 
       System.out.println("I am disposed."); 
      } else if (!shell.isDisposed()) { 
       System.out.println("I am NOT disposed."); 
      } 
     } 
    } 
} 

Shell thực sự cần được xử lý rõ ràng như thế nào? Nếu vậy, làm thế nào để bạn biết khi nào để vứt bỏ một Shell, và phương pháp xử lý nên xuất hiện ở đâu?

Trả lời

13

Các paper rằng bạn trích dẫn cho thấy rõ điều này:

Widgets mình thường không cần phải được xử lý lập trình. Một vỏ và con của nó được xử lý khi người dùng đóng cửa sổ của nó.

Vì vậy, trong khi một vỏ không cần phải được xử lý, gánh nặng không phải là do bạn làm như vậy. Bạn cũng không cần gọi số dispose trên bất kỳ trẻ nào, vì việc vứt bỏ cha mẹ sẽ làm điều đó cho bạn. Một lần nữa, từ liên kết bạn trích dẫn:

Khi bạn vứt bỏ Shell, con của nó sẽ được xử lý. Trong thực tế, xử lý bất kỳ Composite sẽ xử lý tất cả các trẻ em của Composite.

Tuy nhiên, bạn phải đảm bảo rằng bạn vứt bỏ tài nguyên bạn tạo là không phải là trẻ em. Ví dụ: màu sắc và phông chữ. Bạn thực sự cần phải gọi phương thức vứt bỏ của họ. Tốt nhất là hãy móc một người nghe vứt bỏ vào số Composite bạn đang sử dụng chúng để thực hiện việc này. Ví dụ:

public class MyComposite extends Composite 
{ 
    private final Color color; 

    public MyComposite(Composite parent, int style) 
    { 
     super(parent, style); 

     color = new Color(getShell().getDisplay(), 255, 255, 255); 

     addDisposeListener(new DisposeListener() { 
      public void widgetDisposed(DisposeEvent e) 
      { 
       color.dispose(); 
      } 
     }); 
    } 
} 

Điều quan trọng cần lưu ý, tuy nhiên, bạn không nên vứt bỏ Color s mà bạn sử dụng nhưng không tạo. Ví dụ: không thải màu hệ thống có sẵn từ Display#getSystemColor().

+0

Câu trả lời hay, cảm ơn bạn. – Buttons840

Các vấn đề liên quan