Me han dicho y tengo read que los objetos SWT deben eliminarse explícitamente llamando a su método dispose
. Sin embargo, en mis propias pruebas con el siguiente código, he notado que al menos Shell
s se informan como eliminados a pesar de que el método de eliminación nunca se llama (ni aparece) en ninguna parte de mi código.¿Debo eliminar explícitamente los depósitos SWT?
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.");
}
}
}
}
¿Entonces Shell realmente tiene que eliminarse explícitamente? Si es así, ¿cómo sabe cuándo desechar un Shell y dónde debería aparecer el método de eliminación?
Gran respuesta, gracias. – Buttons840