2013-03-15 6 views
11

Ich habe Probleme, den Rahmen als Eigentümer für den Dialog festzulegen. Normalerweise, wenn ich JDialog Klasse zum Erstellen eines Dialogfelds erweitern, dann verwende ich super(frame), um den Besitzer des Dialogfelds anzugeben, so dass beide nicht disjunkt sind, wenn Sie alt+tab drücken. Aber wenn ich einen Dialog unter Verwendung new wie JDialog dialog = new JDialog() dann anstelle, kann ich den Rahmen nicht als Inhaber zum Dialog spezifizieren.So legen Sie den JFrame als übergeordnetes Element für den JDialog fest

Das folgende Beispiel zeigt zwei Ansätze. Top Click Schaltfläche öffnet einen Dialog, der ohne Erweitern von JDialog ist. Bottom Click Schaltfläche öffnet einen Dialog mit Erweiterung 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

tatsächlich suchen (nicht ausgeführt) bei Ihrem Code: Was ist das Problem (außer Ihre nicht sinnvollen Alias ​​im erweiterten Rahmen)? – kleopatra

+0

@kleopatra __extending JDialog ist so schlimm wie die Erweiterung von JFrame__ Exactly. Das ist der Grund, warum ich wissen möchte, wie ich den Rahmen als Besitzer des Dialogs erstellen kann, wenn ich einen Dialog mit new erstelle. – Amarnath

+0

Verwenden Sie den Konstruktor, der den Rahmen wie bei der Erweiterung verwendet? Muss etwas fehlen ... bitte erklären :-) – kleopatra

Antwort

10

Ein Dialog (oder Fensters) Eigentümer kann nur im Konstruktor eingestellt werden, so dass der einzige Weg, um es festgelegt ist, indem ein Konstruktor, die den Eigentümer als Parameter nimmt, wie:

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