Подтвердить что ты не робот

Центр JDialog над родителем

У меня есть приложение Java swing с кнопкой, которая создает всплывающее окно, когда выполняется определенное действие. Я бы хотел выровнять центральную точку всплывающего окна с центральной точкой родительского окна, когда оно отображается. Как я могу вычислить координаты x, y для подключения к setLocation() для всплывающего окна?

Просто уточнить. Мне не нужно поведение setLocationRelativeTo(), потому что он устанавливает верхний левый пиксел всплывающего окна по центральному пикселю родительского кадра. Я хочу установить центральный пиксел всплывающего окна по центральному пикселю родительского кадра.

4b9b3361

Ответ 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, что приводит к тому, что "верхний левый пиксель всплывающего окна по центральному пикселю родительского" позиционирования упоминается в комментарии к одному из других ответов.

Ответ 4

Вы можете попробовать передать координаты родительского окна и его размер в новое окно и добавить координаты + 1/2 размер родительского кадра в каждой оси - 1/2 всплывающих окон x/y до центра по центру.

Или.. Если вы расширяете, вы можете использовать setLocationRelativeTo (owner)

Надеюсь, что это поможет

Ответ 5

Вы можете использовать событие e для получения родительского окна. Используйте getWindowAncestor и e.getSource().

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