2013-03-15 1 views
11

У меня возникли проблемы с установкой рамки в качестве владельца в диалоговом окне. Обычно, когда я расширяю класс JDialog для создания диалогового окна, я использую super(frame), чтобы указать владельца диалогового окна таким образом, чтобы оба они не пересекались при нажатии alt+tab. Но когда я создаю диалог с помощью new, например JDialog dialog = new JDialog(), тогда я не могу указать кадр как владельца в диалоговом окне.Как установить JFrame в качестве родителя для 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); 
     } 
    } 
} 
+0

на самом деле смотрел (не запускался) на ваш код: в чем проблема (за исключением вашего неосновательного псевдонима для рамки в расширенном)? – kleopatra

+0

@ kleopatra __расширение JDialog так же плохо, как расширение JFrame__ Точно. Именно по этой причине я хочу знать, как создать рамку в качестве владельца диалогового окна при создании диалога с использованием нового. – Amarnath

+0

с использованием конструктора, который принимает рамку так же, как и при ее расширении? Должно быть, что-то не хватает ... пожалуйста, объясните :-) – kleopatra

ответ

10

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^