2010-04-28 8 views
3

donné le code suivant:par défaut après disposer et setVisible

public class DialogTest implements ActionListener { 
    public static void main(String[] args) {DialogTest g = new DialogTest();} 

    public DialogTest() { 
    JButton b1 = new JButton("Button A"); 
    b1.addActionListener(this); 
    JDialog d = new JDialog(); 
    d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); 
    JPanel p = new JPanel(); 
    p.add(b1); 
    d.add(p); 
    d.getRootPane().setDefaultButton(b1); 
    d.pack(); 
    d.setVisible(true); 
    d.dispose(); 
    d.pack(); 
    d.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) {System.out.println("hello");} 
} 

ne devrait pas appuyer sur la touche Saisir des données d'écriture à la console? Selon les docs (http://java.sun.com/javase/7/docs/api/java/awt/Window.html#dispose()):

La fenêtre et ses sous-composants être fait affichable à nouveau par la reconstruction des ressources indigènes avec un appel ultérieur à emballer ou spectacle. Les états de la fenêtre et recréée ses seront identiques sous-composants aux états de ces objets au point où la fenêtre était disposée

Est-ce prévu comportement?

+0

J'ai essayé de l'exécuter et il fonctionne très bien, ne sais pas pourquoi vous avez un Éliminez() dans votre constructeur. Pouvez-vous clarifier votre question? que demandez-vous ? –

+1

Bien que je ne puisse pas expliquer le comportement, je peux le reproduire. 'd.getRootPane(). getDefaultButton()' retourne 'null' dès que' dispose() 'a été appelé. –

+0

Juste être curieux. Pourquoi fais-tu 'disposition()', puis un 'pack()' et encore 'setVisible (true)'? –

Répondre

1

La raison est que dans JButton.removeNotify (qui semble être appelé à dispose) le DefaultButton est remis à zéro:

Dérogations JComponent.removeNotify pour vérifier si ce bouton est actuellement défini comme le bouton par défaut sur le RootPane, et si Par conséquent, définit le bouton par défaut de RootPane sur null pour s'assurer que le RootPane ne conserve pas une référence de bouton non valide.


public void removeNotify() { 
    JRootPane root = SwingUtilities.getRootPane(this); 
    if (root != null && root.getDefaultButton() == this) { 
     root.setDefaultButton(null); 
    } 
    super.removeNotify(); 
} 
+0

Merci, c'est l'explication. Bien que je pense toujours que les documents devraient être corrigés alors ou au moins être plus précis. –

+0

@DaDaDom: D'accord, la documentation n'est pas complète à ce stade, et il peut y avoir d'autres choses qui ne fonctionneront pas après un 'disposer'. Quoi qu'il en soit, 'setVisible' est ce que vous voulez vraiment (comme vous le savez déjà). –

Questions connexes