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);
}