2011-01-05 10 views

Antwort

2

Das glaube ich nicht, dass Sie es deaktivieren können (wie macht es grau), da sie direkt durch den zugrunde liegenden Betriebssystem Window-Manager, nicht von SWT verwaltet wird.

Sie können einen Zuhörer allerdings hinzufügen, um wie in this snippet jedes close-Ereignis, ein wenig zu ignorieren:

import org.eclipse.swt.*; 
import org.eclipse.swt.widgets.*; 

public class Snippet99 { 

public static void main (String [] args) { 
    Display display = new Display(); 
    final Shell shell = new Shell (display); 
    shell.addListener (SWT.Close, new Listener() { 
     public void handleEvent (Event event) { 
      int style = SWT.APPLICATION_MODAL | SWT.YES | SWT.NO; 
      MessageBox messageBox = new MessageBox (shell, style); 
      messageBox.setText ("Information"); 
      messageBox.setMessage ("Close the shell?"); 
      event.doit = messageBox.open() == SWT.YES; 
     } 
    }); 
    shell.pack(); 
    shell.open(); 
    while (!shell.isDisposed()) { 
     if (!display.readAndDispatch()) display.sleep(); 
    } 
    display.dispose(); 
} 
} 

In Ihrem Fall, geben Sie einfach 'event.doit' zu false.

4

Eine andere Möglichkeit besteht darin, die Anwendung "zu symbolisieren", wenn der Benutzer die Anwendung schließen möchte, dh die Anwendung wird in den Tray-Artikel verschoben. Fügen Sie Ihrem ApplicationWorkbenchWindowAdvisor folgendes hinzu:

a. Überschreiben postWindowOpen

 
public void postWindowOpen() { 
    Shell shell = getWindowConfigurer().getWindow().getShell(); 
    boolean trayEnabled = false; 
    trayEnabled = enableTray(); 
} 

b. Geräteträgerunterstützung

 
    /* Enable System-Tray Support */ 
    private boolean enableTray() { 
     /* Avoid that this is being called redundantly */ 
     if (this.fTrayEnabled) { 
      return true; 
     } 
     /* Only enable for Primary Window */ 
     IWorkbenchWindow primaryWindow = PlatformUI.getWorkbench().getWorkbenchWindows()[0]; 
     if (primaryWindow == null || !primaryWindow.equals(getWindowConfigurer().getWindow())) { 
      return false; 
     } 

     final Shell shell = primaryWindow.getShell(); 
     final Tray tray = shell.getDisplay().getSystemTray(); 

     /* Tray not support on the OS */ 
     if (tray == null) { 
      return false; 
     } 

     /* Create Item in Tray */ 
     this.fTrayItem = new TrayItem(tray, SWT.NONE); 
     this.fTrayItem.setToolTipText(Platform.getProduct().getName()); 
     this.fTrayEnabled = true; 

     this.fTrayItem.setVisible(false); 
     /* Apply Image */ 
     this.fTrayItem.setImage(trayIcon); 
     /* Minimize to Tray on Shell Iconify if set */ 
     this.fTrayShellListener = new ShellAdapter() { 
      @Override 
      public void shellIconified(final ShellEvent e) { 
       if (!ApplicationWorkbenchWindowAdvisor.this.fBlockIconifyEvent && ApplicationWorkbenchWindowAdvisor.this.fMinimizeFromClose) { 
        moveToTray(shell); 
       } 
      } 
     }; 
     shell.addShellListener(this.fTrayShellListener); 

     /* Show Menu on Selection */ 
     this.fTrayItem.addListener(SWT.MenuDetect, new Listener() { 


      public void handleEvent(final Event event) { 
       MenuManager trayMenu = new MenuManager(); 

       /* Restore */ 
       trayMenu.add(new ContributionItem() { 
        @Override 
        public void fill(final Menu menu, final int index) { 
         MenuItem restoreItem = new MenuItem(menu, SWT.PUSH); 
         restoreItem.setText("Restore from Tray"); 
         restoreItem.addSelectionListener(new SelectionAdapter() { 
          @Override 
          public void widgetSelected(final SelectionEvent e) { 
           restoreFromTray(shell); 
          } 
         }); 
         menu.setDefaultItem(restoreItem); 
        } 
       }); 

       /* Separator */ 
       trayMenu.add(new Separator()); 

       /* Other Items */ 
       ApplicationWorkbenchWindowAdvisor.this.fActionBarAdvisor.fillTrayItem(trayMenu); 

       Menu menu = trayMenu.createContextMenu(shell); 
       menu.setVisible(true); 
      } 
     }); 
     /* Handle DefaultSelection */ 
     this.fTrayItem.addListener(SWT.DefaultSelection, new Listener() { 
      public void handleEvent(final Event event) { 
       /* Restore from Tray */ 
       if (!shell.isVisible()) { 
        restoreFromTray(shell); 
       } else { 
        moveToTray(shell); 
       } 
      } 
     }); 
     return true; 
    } 
    /* Move to System Tray */ 
    private void moveToTray(final Shell shell) { 
     this.fTrayItem.setVisible(true); 
     this.fBlockIconifyEvent = true; 
     try { 
      shell.setVisible(false); 
     } finally { 
      this.fBlockIconifyEvent = false; 
     } 

     this.fMinimizedToTray = true; 
    /** 
    * @param shell 
    */ 
    public void restoreFromTray(final Shell shell) { 

     /* Restore Shell */ 
     shell.setVisible(true); 
     shell.setActive(); 
     shell.layout(true); 

     /* Un-Minimize if minimized */ 
     if (shell.getMinimized()) { 
      shell.setMinimized(false); 
     } 
     this.fTrayItem.setVisible(false); 

     if (this.fTrayTeasing) { 
      this.fTrayItem.setImage(this.trayImage); 
     } 

     this.fTrayTeasing = false; 
     this.fMinimizedToTray = false; 
    } 

    /* Disable System-Tray Support */ 
    private void disableTray() { 

     /* Avoid that this is being called redundantly */ 
     if (!this.fTrayEnabled) { 
      return; 
     } 

     /* First make sure to have the Window restored */ 
     restoreFromTray(getWindowConfigurer().getWindow().getShell()); 

     this.fTrayEnabled = false; 
     this.fMinimizedToTray = false; 

     if (this.fTrayItem != null) { 
      this.fTrayItem.dispose(); 
     } 

     if (this.fTrayShellListener != null) { 
      getWindowConfigurer().getWindow().getShell().removeShellListener(this.fTrayShellListener); 
     } 
    } 

c. Außer Kraft setzen preWindowShellClose

 
@Override 
public boolean preWindowShellClose() { 
    final res = true ; 
    this.fMinimizeFromClose = true; 
    getWindowConfigurer().getWindow().getShell().notifyListeners(SWT.Iconify, new Event()); 
    res = false; 
    this.fMinimizeFromClose = false; 
    return res; 
} 

HTH Tom

+0

Danke viel, helfen diese mir sehr – picciopiccio

+0

Interessante Alternative (habe es nicht sofort zu der Zeit). +1 – VonC

+0

Das brachte mich am Ende, aber es hat viel Arbeit gekostet. Sie zeigen nicht die Deklaration Ihrer Klassenvariablen (wie fBlockIconifyEvent, fMinimizeFromClose, usw.) und einige von ihnen sind nicht notwendig. Außerdem gibt es in ApplicationActionBarAdvisor standardmäßig kein fillTrayItem. Mit diesen Fehlern gab es mir jedoch die umfassende Lösung, die ich brauchte. –

Verwandte Themen