Как установить JFrame в качестве родителя для JDialog

У меня возникли проблемы с установкой фрейма в качестве владельца диалогового окна. Обычно, когда я расширяю класс JDialog для создания диалога, я использую super(frame), чтобы указать владельца диалога, чтобы они оба не пересекались, когда вы нажимаете alt+tab. Но когда я создаю диалог, используя new, например JDialog dialog = new JDialog(), я не могу указать фрейм в качестве владельца диалога.

Следующий пример демонстрирует два вышеуказанных подхода. Кнопка Top Click открывает диалоговое окно, которое не расширяет JDialog. Кнопка Bottom Click открывает диалог с расширением JDialog.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;

public class DialogEx {

    public static void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
                new DialogEx().createUI();
            }
        };
        EventQueue.invokeLater(r);
    }   

    private void createUI() {
        final JFrame frame = new JFrame();
        frame.setLayout(new BorderLayout());

        JButton button1 = new JButton("Top Click");
        JButton button2 = new JButton("Bottom Click");

        button2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                new DialogExtend(frame).createUI();
            }
        });

        button1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent event) {
                new DialogWithoutExtend(frame).cretaUI();
            }
        });

        frame.setTitle("Test Dialog Instances.");
        frame.add(button1, BorderLayout.NORTH);
        frame.add(button2, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(new Dimension(300, 200));
        frame.setVisible(true);
    }

    class DialogExtend extends JDialog {
        private JFrame frame;
        public DialogExtend(JFrame frame) {
            super(frame);
            this.frame = frame;
        }

        public void createUI() {
            setLocationRelativeTo(frame);
            setTitle("Dialog created by extending JDialog class.");
            setSize(new Dimension(400, 100));
            setModal(true);
            setVisible(true);
        }
    }

    class DialogWithoutExtend {

        private JFrame frame;
        public DialogWithoutExtend(JFrame frame) {
            this.frame = frame;
        }

        public void cretaUI() {
            JDialog dialog = new JDialog();
            dialog.setTitle("Dialog created without extending JDialog class.");
            dialog.setSize(new Dimension(400, 100));
            dialog.setLocationRelativeTo(frame);
            dialog.setModal(true);
            dialog.setVisible(true);
        }
    }
}

person Amarnath    schedule 15.03.2013    source источник
comment
на самом деле смотрел (не запускал) ваш код: в чем проблема (кроме вашего ненужного псевдонима для фрейма в расширенном)?   -  person kleopatra    schedule 15.03.2013
comment
@kleopatra расширение JDialog так же плохо, как расширение JFrame Точно. Вот почему я хочу знать, как сделать фрейм владельцем диалогового окна, когда я создаю диалоговое окно с помощью нового.   -  person Amarnath    schedule 15.03.2013
comment
используя конструктор, который принимает кадр так же, как и при его расширении? Должно быть, что-то упущено ... объясните, пожалуйста :-)   -  person kleopatra    schedule 15.03.2013
comment
@kleopatra Я обновил код. Посмотрите класс DialogWithoutExtend , который создает диалог без расширения JDialog. Можете ли вы сказать здесь, как я могу сделать фрейм владельцем этого диалога.   -  person Amarnath    schedule 15.03.2013
comment
опять же, до сих пор не вижу: что не так с... новым JDialog(frame)?   -  person kleopatra    schedule 15.03.2013
comment
ха-ха.. так просто... Спасибо. Никогда не пробовал это.. new JDialog(frame)?   -  person Amarnath    schedule 15.03.2013
comment
@kleopatra Если вы не возражаете, не могли бы вы изложить свое предложение в качестве ответа. Такой, что я могу это принять.   -  person Amarnath    schedule 15.03.2013
comment
+1 за SSCCE   -  person Reimeus    schedule 15.03.2013
comment
@kleopatra Я понимаю, что это устаревшая тема, но почему такая плохая идея расширять JFrame (или JDialog)?   -  person ags    schedule 16.08.2015
comment
@ags Множественное наследование не поддерживается в Java. Только при необходимости нам нужно использовать класс расширения. В этом сценарии мы также можем добиться поведения с помощью Implements.   -  person Amarnath    schedule 16.08.2015


Ответы (1)


Владелец диалогового окна (или окна) может быть установлен только в конструкторе, поэтому единственный способ установить его — использовать конструктор, который принимает владельца в качестве параметра, например:

class DialogWithoutExtend {

    private JFrame frame;
    public DialogWithoutExtend(JFrame frame) {
        this.frame = frame;
    }

    public void cretaUI() {
        JDialog dialog = new JDialog(frame);
        dialog.setTitle("Dialog created without extending JDialog class.");
        dialog.setSize(new Dimension(400, 100));
        dialog.setLocationRelativeTo(frame);
        dialog.setModal(true);
        dialog.setVisible(true);
    }
}
person kleopatra    schedule 15.03.2013