Java Swing: диалог позиционирования поверх существующего окна
Может ли кто-нибудь показать простой Java Swing-код/веб-ресурс, который позиционирует выпадающий центр всплывающих окон в верхней части существующего окна JFrame при нажатии кнопки JFrame?
Ответы
Ответ 1
О, это довольно просто:
Скажем, у вас есть JFrame, который содержит JDialog, и вы хотите, чтобы JDialog (при открытии) находился прямо над JFrame.
Итак, в конструкторе JDialog у вас должно быть что-то вроде:
public class MyDialog extends JDialog
public MyDialog(JFrame parent)
{
super.setLocationRelativeTo(parent); // this will do the job
}
Другими словами, передайте указатель JFrame в ваш диалог и вызовите setLocationRelativeTo (...); Метод.
Ответ 2
Обычно я вызываю следующий метод:
dialog.setLocationRelativeTo(parent);
Ссылка на Javadocs
Ответ 3
О каком всплывающем диалоге вы говорите? Если вы используете JOptionPane или что-то подобное, установите его родительский компонент в JFrame, и он автоматически центрируется поверх окна JFrame.
JOptionPane.showMessageDialog(frame, "Hello, World!");
Если вы создаете свой собственный JDialog, вы можете получить позицию JFrame, используя JFrame.getLocation() и его размер, используя JFrame.getSize(). Математика довольно проста оттуда; просто вычислите центр JFrame и вычтите половину ширины/высоты JDialog, чтобы получить верхний левый угол вашего диалога.
Если ваш JDialog еще не был отображен, JFrame.getSize() может дать вам нулевой размер. В этом случае вы можете использовать JDialog.getPreferredSize(), чтобы узнать, насколько велика она будет отображаться на экране.
Ответ 4
Если вам нужен модальный и центрированный диалог в окне...
В конструкторе диалога:
class CustomDialog extends JDialog {
public CustomDialog(Frame owner, String title, boolean modal) {
super(owner, title, modal);
setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
...
setSize(150, 100);
setLocationRelativeTo(owner);
}
}
Чтобы отобразить диалог (с помощью кнопки и т.д.):
public void actionPerformed(ActionEvent e) {
dialog.setVisible(true);
}