Comment puis-je obtenir que mon application SWT de base se ferme correctement sous Mac OS X 10.5.6?

StackOverflow https://stackoverflow.com/questions/483173

  •  20-08-2019
  •  | 
  •  

Question

J'ai le code de test SWT suivant:

public static void main(String[] args) {
    shell = new Shell();
    shell.setText(APP_NAME + " " + APP_VERSION);
    shell.addShellListener(new ShellListener() {
        public void shellActivated(ShellEvent event) { }
        public void shellClosed(ShellEvent event) { exit(); }
        public void shellDeactivated(ShellEvent event) { }
        public void shellDeiconified(ShellEvent event) { }
        public void shellIconified(ShellEvent event) { }
    });     
    shell.open();
    display = shell.getDisplay();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) {
            display.sleep();
        }
    }
    display.dispose();
}

Ma méthode exit () est la suivante:

private void exit() {
    System.exit(0);
}

J'essaie de quitter l'application en fermant le shell (& "fenêtre &") ou en déroulant le menu de l'application (& "SWT &";) et en sélectionnant < !> "Quittez &";

Lorsque je le fais, un talon SWT est laissé dans le Dock et l'application SWT n'est pas encore sortie. Je dois terminer manuellement l'application SWT via Eclipse ou via Forcer quitter.

J'ai essayé cela avec les fichiers jar v3.4 et v3.5 SWT, sous Eclipse 3.4.1 sous Mac OS X 10.5.6 (Intel).

Dois-je effectuer un travail supplémentaire pour pouvoir quitter l'application lorsque je ferme le shell?

Était-ce utile?

La solution

Vous ne libérez pas les ressources natives correctement, vous avez une fuite de ressources.

Vous n'avez pas besoin de faire ceci:

private void exit() {
    System.exit(0);
}

La méthode principale se fermera lorsque le shell sera supprimé. Si vous devez utiliser une méthode de sortie, appelez-la après avoir supprimé toutes les ressources SWT:

    Display display = new Display();
    try {
        Shell shell = new Shell(display);
        try {
            shell.open();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch()) {
                    display.sleep();
                }
            }
        } finally {
            if (!shell.isDisposed()) {
                shell.dispose();
            }
        }
    } finally {
        display.dispose();
    }
    System.exit(0);

Autres conseils

Lorsque vous avez attribué le shell:

shell = new Shell();

certaines ressources natives ont été allouées avec. Vous devez disposer de ces ressources avant de quitter votre application:

private void exit() {
    shell.dispose();
    System.exit(0);
}

Bien sûr, vous devez fournir le " shell & "; variable à votre méthode exit () pour le faire.

Notez que je ne crois pas que vous ayez besoin de vous débarrasser de l'écran, car vous ne l'avez pas créé avec " new Display() & ";. Mais tout ce qui se trouve dans SWT (à l'exception de quelques éléments pour lesquels cela est documenté dans le JavaDoc) que vous créez avec new doit être éliminé lorsque vous avez terminé. Sinon, vous perdrez des ressources natives.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top