Центр JDialog над родителем
У меня есть приложение Java swing с кнопкой, которая создает всплывающее окно, когда выполняется определенное действие. Я бы хотел выровнять центральную точку всплывающего окна с центральной точкой родительского окна, когда оно отображается. Как я могу вычислить координаты x, y для подключения к setLocation()
для всплывающего окна?
Просто уточнить. Мне не нужно поведение setLocationRelativeTo()
, потому что он устанавливает верхний левый пиксел всплывающего окна по центральному пикселю родительского кадра. Я хочу установить центральный пиксел всплывающего окна по центральному пикселю родительского кадра.
Ответы
Ответ 1
setLocationRelativeTo
..это устанавливает верхний левый пиксел всплывающего окна по центральному пикселю родителя...
Нет, это не так!
![Centered Dialog]()
Каждый из трех диалогов, выложенных этим простым примером, по-видимому, находится по центру, насколько я могу видеть. Я могу только догадываться, что код вызывает 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 Runnable() {
public void run() {
new CenterTheDialog();
}
});
}
}
Ответ 2
В JDialog
, который вы создали, вы должны сначала вызвать pack()
, затем setLocationRelativeTo(parentFrame)
, а затем setVisible(true)
. С этим порядком JDialog
должен располагаться в центре на родительском фрейме.
Если вы сначала не вызываете pack()
, тогда установка местоположения относительно родителя не работает должным образом, потому что JDialog
не знает, какой размер в этой точке. Похоже, что размер равен 0 на 0, что приводит к тому, что "верхний левый пиксель всплывающего окна по центральному пикселю родительского" позиционирования упоминается в комментарии к одному из других ответов.
Ответ 3
Window#setLocationRelativeTo
Ответ 4
Вы можете попробовать передать координаты родительского окна и его размер в новое окно и добавить координаты + 1/2 размер родительского кадра в каждой оси - 1/2 всплывающих окон x/y до центра по центру.
Или.. Если вы расширяете, вы можете использовать setLocationRelativeTo (owner)
Надеюсь, что это поможет
Ответ 5
Вы можете использовать событие e
для получения родительского окна. Используйте getWindowAncestor
и e.getSource()
.
dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor((Component) e.getSource()))