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

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

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

 Qwerky05 апр. 2012 г., 17:15
Андрей говорит правду! Вы должны рассмотреть возможность использованияJDialog вместоJFrame.
 Chris Drappier05 апр. 2012 г., 17:17
это на самом деле jdialog. но действительно ли это имеет значение для этого конкретного сценария? все, что мне нужно, это расчет для х и у.

Ответы на вопрос(5)

 Chris Drappier05 апр. 2012 г., 17:14
это устанавливает верхний левый пиксель всплывающего окна над центральным пикселем родителя. Я хочу установить центральный пиксель всплывающего окна над центральным пикселем родительского
 05 апр. 2012 г., 17:24
@CrhsiDrappier Вы уверены?then the window is located in such a way that the center of the window coincides with the center of the component.
 05 апр. 2012 г., 23:51
"Are you sure?"  ОП, безусловно, неверен, как показано в моем примере, который расширяет ваш ответ. Ото они, кажется, полны решимости держать голову глубоко в песке, так что .. (пожимает плечами)
Решение Вопроса

setLocationRelativeTo ..this sets the top left pixel of the popup over the center pixel of the parent. ..

Нет!

Centered Dialog

Насколько я вижу, каждое из 3 диалогов, появившихся в этом простом примере, выглядит по центру. Я могу только догадываться, что код вызываетsetLocationRelativeTo at the wrong time.

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();
        });
    }
}
 23 сент. 2012 г., 20:11
...calling setLocationRelativeTo at the wrong time.Да, я звонил раньшеpack()!
 Chris Drappier05 апр. 2012 г., 23:47
это происходит в моем проекте, возможно, по какой-то другой причине. Я действительно ненавижу свинг. в любом случае, ответ ФилНерда дал мне (отчасти) то, что я искал, как рассчитать его. Я принял его ответ и перешел к следующей ошибке. Спасибо!

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

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

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

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

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

 05 апр. 2012 г., 17:45
Готово. Рад, что я мог помочь
 05 апр. 2012 г., 23:14
"Or..If you extend you could use setLocationRelativeTo(owner) but it will be slightly off"  Не нужно его расширять или делать на лету расчеты. Смотри мой ответ.
 Chris Drappier05 апр. 2012 г., 17:41
добавьте свои комментарии к своему ответу, и я приму. Это не идеально, но я думаю, что у меня могут быть другие вещи, которые влияют на результат. Я действительно не хочу публиковать здесь весь свой проект. Благодарю.
 05 апр. 2012 г., 17:21
хорошо, если вы решили следовать моей формуле, вы могли бы просто дополнительно минус 1/2 размера х / у всплывающих окон.
 Chris Drappier05 апр. 2012 г., 17:14
это устанавливает верхний левый пиксель всплывающего окна над центральным пикселем родителя. Я хочу установить центральный пиксель всплывающего окна над центральным пикселем парен

НаJDialog вы создали, вам следует позвонитьpack() будет первыйsetLocationRelativeTo(parentFrame), а потомsetVisible(true), С этим заказомJDialog должен отображаться по центру родительского кадра.

Если вы не звонитеpack() во-первых, затем установка местоположения относительно родителя не работает должным образом, потому чтоJDialog не знает, какой у него размер на данный момент. Кажется, он принимает размер от 0 до 0, что приводит к появлению «левого верхнего пикселя всплывающего окна над центральным пикселем родительского элемента». Позиционирование упоминается в комментарии к одному из других ответов.

 01 февр. 2013 г., 19:08
Это отлично сработало для меня. Спасибо, МБ!

Ваш ответ на вопрос