2012-03-15 1 views
6

Attualmente sto sviluppando un'applicazione java SWT su Windows 7. Generalmente l'applicazione sarà ridotta a icona e quando c'è un evento sulla porta seriale l'applicazione dovrebbe massimizzarsi. Il codice seguente fa la parte di massimizzazione.Applicazione SWT Java - Porta in primo piano

private void bringToFront(final Shell shell) { 
    shell.getDisplay().asyncExec(new Runnable() { 
     public void run() { 
      if(!shell.getMaximized()){ 
       shell.setMaximized(true); 
      } 
      shell.forceActive(); 
     } 
    }); 
} 

Ma a volte l'applicazione SWT è ingrandita dietro un'altra applicazione. Ad esempio, se ho un powerpoint in esecuzione in modalità Schermo intero, l'applicazione massimizzata è dietro la presentazione di PowerPoint. Mi piacerebbe averlo massimizzato e portato di fronte a tutte le altre applicazioni.

Qualcuno può aiutarmi?

+0

No. Il metodo forceActive sposta la shell nella parte superiore dell'ordine Z. Questo porterà la shell in primo piano se e solo se nessun'altra finestra si sta spostando anche verso l'alto dell'ordine Z. –

risposta

5

È necessario impostare il bit di stile SWT.ON_TOP sul Shell istanza. Sfortunatamente l'impostazione dei bit di stile è possibile solo nel costruttore.

Ma se capisco il tuo caso d'uso, l'impostazione di quel bit potrebbe essere praticabile per te, dal momento che ti sembra di passare dallo stato minimizzato a quello massimizzato.

Se ciò non è possibile, è sufficiente disporre e ricreare la shell e il suo contenuto, quando si desidera passare da uno stato all'altro.

4

Ho trovato qualche soluzione per il problema, potrebbe non essere la soluzione migliore ma funziona per me. Se qualcuno ha una soluzione migliore continua a postare. Grazie

Utilizzando il metodo ShowDesktop() primo simulare Tasto Windows + D evento per mostrare il desktop di

 private void showDesktop() { 
     try{ 
      Robot robot = new Robot(); 
      robot.keyPress(KeyEvent.VK_WINDOWS); 
      robot.keyPress(KeyEvent.VK_D); 
      robot.keyRelease(KeyEvent.VK_D); 
      robot.keyRelease(KeyEvent.VK_WINDOWS); 
      } 
     catch(Exception e){e.printStackTrace();} 
    } 

quindi ingrandire l'applicazione shell

private void bringToFront(final Shell shell) { 

     showDesktop(); //minimize all the application 

     Thread.sleep(5000); // here have to wait for some time, I am not sure why 

     shell.getDisplay().asyncExec(new Runnable() { 
     public void run() { 
      if(!shell.getMaximized()){ 
       shell.setMaximized(true); 
      } 
      shell.forceActive(); 
     } 
    }); 
    } 
5

C'è un altro "hackey" modo per farlo rispetto a quello che hai trovato, che non richiede di minimizzare tutto il resto. In realtà è necessario chiamare shell.setMinimized(false) e successivamente quello shell.setActive() per ripristinare lo stato precedente di shell. Tuttavia, questo funziona solo se lo shell era veramente nello stato ridotto al minimo. Quindi ecco la mia soluzione finale, che minimizza artificialmente il shell se non fosse già minimizzato. Il costo è un'animazione rapida se la minimizzazione deve essere eseguita.

shell.getDisplay().syncExec(new Runnable() { 

    @Override 
    public void run() { 
     if (!shell.getMinimized()) 
     { 
      shell.setMinimized(true); 
     } 
     shell.setMinimized(false); 
     shell.setActive(); 
    } 
}); 
Problemi correlati