2013-03-15 15 views
11

Ho problemi a impostare il frame come proprietario della finestra di dialogo. Normalmente quando estendo la classe JDialog per la creazione di una finestra di dialogo, allora uso super(frame) per specificare il proprietario della finestra di dialogo in modo che entrambi non siano disgiunti quando si preme alt+tab. Ma quando creo una finestra di dialogo utilizzando new come JDialog dialog = new JDialog(), non riesco a specificare il frame come proprietario della finestra di dialogo.Come impostare JFrame come genitore per JDialog

L'esempio seguente mostra due approcci sopra. Il pulsante Top Click apre una finestra di dialogo che è senza estendere JDialog. Il pulsante Bottom Click apre una finestra di dialogo con estensione 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

effettivamente guardando (non eseguito) al tuo codice: qual è il problema (eccetto il tuo alias non professionale da inserire nell'estensione)? – kleopatra

+0

@kleopatra __destinare JDialog è tanto male quanto estendere JFrame__ Esattamente. Questo è il motivo per cui voglio sapere come posso rendere il frame come proprietario della finestra di dialogo quando creo una finestra di dialogo usando new. – Amarnath

+0

usando il costruttore che prende la cornice come quando la estendi? Deve mancare qualcosa ... per favore spiega :-) – kleopatra

risposta

10

di una finestra (o finestra) proprietario può essere impostato solo nel costruttore, quindi l'unico modo per impostare è quello di utilizzare un costruttore che prende il proprietario come parametri, come:

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