Java Swing: диалог позиционирования поверх существующего окна

может ли кто-нибудь показать простой Java Swing code/web resource, который разместит всплывающее диалоговое окно, выровненное по центру поверх существующего окна JFrame, когда кнопка JFrame нажата?

4 ответов


О..это довольно просто:

скажем, у вас есть JFrame, который содержит JDialog, и вы хотите, чтобы JDialog (при открытии) был прямо поверх JFrame.

поэтому в конструкторе JDialog у вас должно быть что-то вроде:

public class MyDialog extends JDialog 
public MyDialog(JFrame parent) 
{
    super.setLocationRelativeTo(parent); // this will do the job
}

другими словами, Передайте указатель JFrame в свой диалог и вызовите setLocationRelativeTo(...); метод.


обычно я вызываю следующий метод:

dialog.setLocationRelativeTo(parent);

ссылка на Javadocs


о каком всплывающем диалоге вы говорите? Если вы используете JOptionPane или что-то подобное, установите его родительский компонент в JFrame, и он автоматически центрируется поверх окна JFrame.

JOptionPane.showMessageDialog(frame, "Hello, World!");

Если вы создаете свой собственный JDialog, вы можете получить позицию JFrame с помощью JFrame.getLocation () и его размер с помощью JFrame.getsize не(). Математика оттуда довольно проста; просто вычислите центр JFrame и вычитайте половину ширины / высоты из JDialog, чтобы получить верхний левый угол вашего диалога.

Если ваш JDialog еще не был отображен, JFrame.getSize () может дать вам нулевой размер. В этом случае, вы можете использовать JDialog.getPreferredSize (), чтобы узнать, насколько он будет большим после его отображения на экране.


Если вы хотите модальный и центрированный диалог в окне ...

в конструкторе диалогового окна:

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