Почему JDialog «прыгает» на setLocationRelativeTo()?


1

Имейте класс, который расширяет JDialog. Он полностью инициализирован на EDT (на всякий случай). Теперь

public PropsDialog (JFrame parentFrame) 
{ 
    super(parentFrame); 
    // boring 
    pack(); 
    setLocationRelativeTo(getParent()); 
    setVisible(true); 
} 

результаты в диалоге появляются в крайнем левом углу, а затем прыгает на него предназначено, положение. Я делаю что-то неправильно?

  0

Что происходит, когда вы звоните пакет() после setLocationRelativeTo()? 22 фев. 092009-02-22 11:36:20

  0

Переход от одного и того же угла и заканчивается неправильно по отношению к родительскому кадру (что является правильным). Похоже на ошибку, поскольку я получаю это поведение только на встроенных LaFs. Synth работает так, как ожидалось. 22 фев. 092009-02-22 12:44:38

  0

Как насчет вызова setVisible (false) непосредственно перед setLocationRelativeTo()? 22 фев. 092009-02-22 13:32:08

  0

Действительно оцените ваши усилия. Благодарю. К сожалению, это ничего не меняет. Я думаю, что в конечном итоге я проверю разные JDK под Win, Linux и Mac, чтобы узнать, одинаково ли поведение. 22 фев. 092009-02-22 14:51:50

1

Не могли бы вы предоставить рабочий пример и дополнительную информацию? Например, на какой операционной системе вы тестируете? Свинг имеет некоторые отличия между некоторыми, например. JDialogs без родителя, получающего запись в панели gnome, но не в панели задач Windows и тому подобное.

Во-вторых, я бы предположил, что ваш JDialog отображается до того, как вы вызовете setLocationRelativeTo, возможно, через часть, которую вы прокомментировали как «скучный». Я хотел бы предложить, вы удар быстрый

System.out.println(isVisible()); 

в код, как раз перед setLocationRelativeTo, на всякий случай ...

  0

Вы были рядом :). Рефакторинг диалога для расширения JDialog, я пропустил вызов show(). Ранее этот метод вызывал вызов JOptionPane, который, в свою очередь, отображал JDialog и удалялся во время рефакторинга. Но поскольку класс расширяет JDialog сейчас, вызов show() фактически устанавливает его видимым. 25 фев. 092009-02-25 20:56:55