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?
Câu trả lời hay, cảm ơn bạn. – Buttons840