2012-04-05 40 views
23

我有一個Java swing應用程序,它帶有一個按鈕,當執行某個操作時會產生一個彈出窗口。我想將彈出窗口的中心點與父窗口的中心點對齊。如何計算彈出窗口中插入setLocation()的x,y座標?父母的中心JDialog

只是爲了澄清。我不想要setLocationRelativeTo()的行爲,因爲它會在父幀的中心像素上設置彈出框的左上角像素。我想要在父框架的中心像素上設置彈出框的中心像素。

+1

安德魯說實話!您應該考慮使用'JDialog'而不是'JFrame'。 – Qwerky 2012-04-05 15:15:32

+0

它實際上是一個jdialog。但對於這種特殊情況真的很重要嗎?我需要的只是x和y的計算。 – 2012-04-05 15:17:35

回答

41

setLocationRelativeTo ..this設置彈出窗口在父的中心像素的左上角像素。 ..

不,它不!

Centered Dialog

每個由這個簡單的例子中彈出的3個對話框出現據我可以看到爲中心。我只能猜測代碼在錯誤的時間調用了setLocationRelativeTo

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

它發生在我的項目中,也許是出於其他原因。我真的很討厭揮杆。無論如何,PhilNerd的回答讓我感到(我的)要找的是如何計算它。我已經接受了他的回答,並且正在處理下一個錯誤。謝謝! – 2012-04-05 21:47:34

+8

* ...在錯誤的時間調用'setLocationRelativeTo' *:是的,我在'pack()'之前調用它! – bigstones 2012-09-23 18:11:41

5
+0

這設置父級的中心像素上方的彈出窗口的左上像素。我想設置彈出框中心像素的父像素 – 2012-04-05 15:14:33

+1

@CrhsiDrappier你確定嗎? '那麼窗口的位置應使窗口的中心與組件的中心位置一致。「# – Jeffrey 2012-04-05 15:24:25

+0

*」你確定嗎?「* OP肯定是錯誤的,正如我的示例中所示,它擴展了您的答案。 OTOH他們似乎決心把頭埋在沙子深處,所以..(聳聳肩) – 2012-04-05 21:51:49

2

你可以嘗試使所述父窗口的座標和其大小以新的窗口,並添加在各軸的座標+父的1/2幀大小 - 彈出窗口的1/2的x/y以中心爲中心。

Or..If你延長你可以使用setLocationRelativeTo(所有者)

希望這有助於

+0

這設置父級的中心像素上的彈出窗口的左上像素。如果您決定遵循我的公式,您可以額外減去x/y彈出窗口大小的1/2,我想要將彈出窗口的中心像素設置在paren – 2012-04-05 15:14:43

+0

的中心像素上方。 – Phil 2012-04-05 15:21:41

+0

將你的評論添加到你的答案,我會接受。這並不完美,但我想我可能還有其他事情正在影響結果。我真的不想在這裏發佈我的整個項目。謝謝。 – 2012-04-05 15:41:10

45

JDialog你創建你應該叫pack(),再setLocationRelativeTo(parentFrame),然後setVisible(true)。使用該順序,JDialog應該出現在父框架的中心。

如果先不調用pack(),那麼相對於父項的位置設置無法正常工作,因爲JDialog不知道該點的大小。它看起來大小爲0乘0,這導致評論中提到的「父級的中心像素上方的彈出框的左上像素」定位到其他答案之一。

+1

這對我來說非常合適。謝謝MB! – 2013-02-01 18:08:07

1

您可以利用事件e獲取父窗口。使用getWindowAncestore.getSource()

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