我有一個Java swing應用程序,它帶有一個按鈕,當執行某個操作時會產生一個彈出窗口。我想將彈出窗口的中心點與父窗口的中心點對齊。如何計算彈出窗口中插入setLocation()
的x,y座標?父母的中心JDialog
只是爲了澄清。我不想要setLocationRelativeTo()
的行爲,因爲它會在父幀的中心像素上設置彈出框的左上角像素。我想要在父框架的中心像素上設置彈出框的中心像素。
我有一個Java swing應用程序,它帶有一個按鈕,當執行某個操作時會產生一個彈出窗口。我想將彈出窗口的中心點與父窗口的中心點對齊。如何計算彈出窗口中插入setLocation()
的x,y座標?父母的中心JDialog
只是爲了澄清。我不想要setLocationRelativeTo()
的行爲,因爲它會在父幀的中心像素上設置彈出框的左上角像素。我想要在父框架的中心像素上設置彈出框的中心像素。
setLocationRelativeTo
..this設置彈出窗口在父的中心像素的左上角像素。 ..
不,它不!
每個由這個簡單的例子中彈出的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();
});
}
}
它發生在我的項目中,也許是出於其他原因。我真的很討厭揮杆。無論如何,PhilNerd的回答讓我感到(我的)要找的是如何計算它。我已經接受了他的回答,並且正在處理下一個錯誤。謝謝! – 2012-04-05 21:47:34
* ...在錯誤的時間調用'setLocationRelativeTo' *:是的,我在'pack()'之前調用它! – bigstones 2012-09-23 18:11:41
這設置父級的中心像素上方的彈出窗口的左上像素。我想設置彈出框中心像素的父像素 – 2012-04-05 15:14:33
@CrhsiDrappier你確定嗎? '那麼窗口的位置應使窗口的中心與組件的中心位置一致。「# – Jeffrey 2012-04-05 15:24:25
*」你確定嗎?「* OP肯定是錯誤的,正如我的示例中所示,它擴展了您的答案。 OTOH他們似乎決心把頭埋在沙子深處,所以..(聳聳肩) – 2012-04-05 21:51:49
你可以嘗試使所述父窗口的座標和其大小以新的窗口,並添加在各軸的座標+父的1/2幀大小 - 彈出窗口的1/2的x/y以中心爲中心。
Or..If你延長你可以使用setLocationRelativeTo(所有者)
希望這有助於
這設置父級的中心像素上的彈出窗口的左上像素。如果您決定遵循我的公式,您可以額外減去x/y彈出窗口大小的1/2,我想要將彈出窗口的中心像素設置在paren – 2012-04-05 15:14:43
的中心像素上方。 – Phil 2012-04-05 15:21:41
將你的評論添加到你的答案,我會接受。這並不完美,但我想我可能還有其他事情正在影響結果。我真的不想在這裏發佈我的整個項目。謝謝。 – 2012-04-05 15:41:10
在JDialog
你創建你應該叫pack()
,再setLocationRelativeTo(parentFrame)
,然後setVisible(true)
。使用該順序,JDialog
應該出現在父框架的中心。
如果先不調用pack()
,那麼相對於父項的位置設置無法正常工作,因爲JDialog
不知道該點的大小。它看起來大小爲0乘0,這導致評論中提到的「父級的中心像素上方的彈出框的左上像素」定位到其他答案之一。
這對我來說非常合適。謝謝MB! – 2013-02-01 18:08:07
您可以利用事件e
獲取父窗口。使用getWindowAncestor
和e.getSource()
。
dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor((Component) e.getSource()))
安德魯說實話!您應該考慮使用'JDialog'而不是'JFrame'。 – Qwerky 2012-04-05 15:15:32
它實際上是一個jdialog。但對於這種特殊情況真的很重要嗎?我需要的只是x和y的計算。 – 2012-04-05 15:17:35