2012-04-05 15 views
23

Ho un'applicazione Java swing con un pulsante che produce una finestra popup quando viene eseguita una determinata azione. Mi piacerebbe allineare il punto centrale della finestra popup con il punto centrale della finestra genitore al momento del rendering. Come posso calcolare le coordinate x, y per inserire setLocation() per la finestra popup?Centro JDialog sul padre

Giusto per chiarire. Non voglio il comportamento di setLocationRelativeTo() perché imposta il pixel in alto a sinistra del popup sul pixel centrale del frame principale. Voglio impostare il pixel centrale del popup sul pixel centrale del frame principale.

+1

Andrew dice la verità! Dovresti prendere in considerazione l'uso di un 'JDialog' invece di un' JFrame'. – Qwerky

+0

in realtà è un jdialog. ma è davvero importante per questo particolare scenario? tutto ciò di cui ho bisogno è il calcolo per xey. –

risposta

41

setLocationRelativeTo ..questo imposta il pixel in alto a sinistra del pop-up sopra il centro del pixel del genitore. ..

No, non è così!

Centered Dialog

Ognuna delle 3 finestre spuntato da questo semplice esempio sembra essere centrata quanto posso vedere. Posso solo supporre che il codice stia chiamando setLocationRelativeTonel momento sbagliato.

import javax.swing.*; 

class CenterTheDialog { 

    CenterTheDialog() { 
     for (int ii=1; ii<4; ii++) { 
      JFrame f = new JFrame("Frame " + ii); 
      f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

      f.setSize(400,300); 
      f.setLocationByPlatform(true); 
      f.setVisible(true); 

      JDialog d = new JDialog(f); 
      d.setSize(300,200); 
      d.setLocationRelativeTo(f); 
      d.setVisible(true); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> { 
      new CenterTheDialog(); 
     }); 
    } 
} 
+0

sta accadendo nel mio progetto, forse per qualche altro motivo. Odio davvero swing. ad ogni modo, la risposta di PhilNerd mi ha fatto (specie) ciò che stavo cercando, che è come calcolarlo. Ho accettato la sua risposta e sono al prossimo baco. Grazie! –

+8

* ... chiamando 'setLocationRelativeTo' nel momento sbagliato. *: Sì, lo stavo chiamando prima di' pack() '! – bigstones

5
+0

imposta il pixel in alto a sinistra del popup sul pixel centrale del genitore. Voglio impostare il pixel centrale del popup sul pixel centrale del genitore –

+1

@CrhsiDrappier Sei sicuro? 'allora la finestra si trova in modo che il centro della finestra coincida con il centro del componente. – Jeffrey

+0

*" Sei sicuro? "* L'OP è sicuramente sbagliato, come mostrato nel mio esempio che espande la tua risposta. OTOH sembrano determinati a tenere la testa sepolta nella sabbia, quindi ..(alza le spalle) –

2

Si potrebbe provare passando le coordinate della finestra padre e le sue dimensioni per la nuova finestra e aggiungendo il coordinate + 1/2 genitore dimensione del frame in ogni asse - 1/2 dei popups x/y centrarsi sul centro.

Or..If si estende si potrebbe usare setLocationRelativeTo (proprietario)

Spero che questo aiuti

+0

imposta il pixel in alto a sinistra del popup sopra il pixel centrale del genitore. Voglio impostare il pixel centrale del popup sopra il pixel centrale del paren –

+0

bene se hai deciso di seguire la mia formula, potresti anche aggiungere meno 1/2 della dimensione dei popup x/y. – Phil

+0

aggiungi i tuoi commenti alla tua risposta e accetterò. Non è perfetto, ma penso che potrei avere altre cose che stanno influenzando il risultato. Non voglio davvero pubblicare il mio intero progetto qui. Grazie. –

45

Sulla JDialog che hai creato si dovrebbe chiamare pack(), poi setLocationRelativeTo(parentFrame), e poi setVisible(true). Con questo ordine, il JDialog dovrebbe apparire centrato sul frame principale.

Se non si chiama prima pack(), quindi l'impostazione relativa al genitore non funziona correttamente perché il JDialog non sa che dimensione è in quel punto. Sembra prendere la dimensione come 0 per 0, il che risulta nel "pixel in alto a sinistra del popup sopra il pixel centrale del parent" posizionamento citato in un commento a una delle altre risposte.

+1

Questo ha funzionato perfettamente per me. Grazie MB! –

1

È possibile utilizzare l'evento e per ottenere la finestra principale. Utilizzare getWindowAncestor e e.getSource().

dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor((Component) e.getSource()))

Problemi correlati