2010-10-23 7 views
5

Vorrei attivare la mia applicazione Swing in modo programmatico. Voglio dire che mi piacerebbe scrivere un codice che faccia sì che lo JFrame sia visibile e focalizzato (l'intestazione della finestra dovrebbe essere evidenziata). Ho provato a usare requestFocus(). Funziona solo se l'applicazione ha almeno 2 finestre A e B: A è nascosto, B è visibile. Ora se chiamo A.requestFocus() diventa attivo come voglio. Non succede se l'applicazione ha solo una finestra o se entrambe le finestre sono invisibili.Come attivare la finestra in Java?

Ho trovato 2 soluzioni alternative.

  1. uso falso trasparente telaio undecorated che è sempre in primo piano. Questa finta finestra giocherà il ruolo della finestra B. Non ho provato a implementarla ma sembra che dovrebbe funzionare.
  2. chiamata A.setAlwaysOnTop(true). Ciò porta la finestra A in cima ad altre finestre. Ma non è ancora a fuoco. Utilizzare java.awt.Robot (mouseMove, mousePress, mouseRelease) per fare clic sull'intestazione della finestra A. Ora chiamare A.setAlwaysOnTop(false) e riportare il puntatore del mouse nella posizione precedente. Ho implementato il codice e funziona ma sembra una brutta soluzione.

Esiste una soluzione "giusta"?

risposta

1

ho creduto che this post dovrebbe aiutare.

1

Questo dovrebbe farlo:

frame.setSelected(true); 

e probabilmente si desidera all'interno di un blocco try/catch ...

Se questo non funziona sul sistema operativo che si sta utilizzando, ci sono altre due possibilità:

frame.setAlwaysOnTop(true); 
frame.setAlwaysOnTop(false); 

e

frame.setVisible(true); 
frame.setVisible(true); // Yes you need this second one 
+0

Per quanto ne so non esiste un metodo 'Frame.setSelected' –

+0

è in JInternalFrame –

+0

Sì, setSelected() non muore esiste finora ... – AlexR

5
frame.setState(Frame.NORMAL); // restores minimized windows 
frame.toFront(); // brings to front without needing to setAlwaysOnTop 
frame.requestFocus(); 

per tutto ciò che si può desiderare di conoscere nei minimi dettagli, si veda questa pagina: http://www.developer.com/java/other/article.php/3502181/Window-Focus-and-State-in-Java.htm

+0

toFront() ha senso. Grazie! – AlexR

+0

Utilizzare 'requestFocusInWindow' invece di' requestFocus', vedere http://download.oracle.com/javase/tutorial/uiswing/misc/focus.html. –

+0

@Geoffrey - no ... questo è per i componenti di messa a fuoco * dentro * di Windows, non le finestre stesse. Potrebbe essere un buon collegamento per lui per verificare se ha ancora problemi però. –

1

Ero nella stessa barca - nessuno dei precedenti funzionava.

"MY" soluzione è stata segue:

thisFrame.getWindowListeners()[0].windowActivated(
    new WindowEvent(
       thisFrame, 
       WindowEvent.WINDOW_ACTIVATED 
    ) 
); 
schedulesTable.requestFocus(); 

thisFrame = the window to get activated 

schedulesTable = my component in the window I wanted to get focus for 
+0

Grazie. Anche se ho fatto questa domanda molti anni fa e quel progetto è irrilevante ora probabilmente proverò la tua soluzione. – AlexR

Problemi correlati