2012-07-31 5 views
0

Je suis occupé à faire un traitement de texte Java de base en tant que projet personnel, et il comprend un popup JDialog. Cependant, lorsque l'utilisateur clique sur le bouton 'Annuler', le JDialog refuse de se fermer et la seule façon de le fermer est avec le bouton Fermer sur le cadre lui-même. De même, lorsque le bouton 'Confirmer' est activé, la tâche est terminée mais le JDialog reste ouvert. Quelqu'un peut-il aider? Mon JDialog Code init:JDialog refuse de fermer

package cword; 

    import java.awt.*; 
    import java.awt.event.*; 
    import java.io.*; 
    import javax.swing.*; 
    import javax.swing.border.*; 

    public class AlreadyExists extends JDialog 
    { 
     public static final long serialVersionUID = 1L; 
     public AlreadyExists(Frame owner, String pathname, String filename, boolean includedExtension) 
     { 
      super(owner); 
      initComponents(pathname, filename, includedExtension); 
     } 

     private void initComponents(final String pathname, String filename, final boolean includedExtension) 
     { 
      dialogPane = new JPanel(); 
      contentPanel = new JPanel(); 
      label1 = new JLabel(); 
      buttonBar = new JPanel(); 
      okButton = new JButton(); 
      cancelButton = new JButton(); 

      setTitle("Confirm Overwrite"); 
      Container contentPane = getContentPane(); 
      contentPane.setLayout(new BorderLayout()); 

      { 

       dialogPane.setLayout(new BorderLayout()); 

       { 
        contentPanel.setLayout(null); 

        label1.setText("File " + filename + " already exists. Are you sure you want to overwrite?"); 
        contentPanel.add(label1); 
        label1.setBounds(new Rectangle(new Point(0, 5), label1.getPreferredSize())); 

        { 
         Dimension preferredSize = new Dimension(); 
         for(int i = 0; i < contentPanel.getComponentCount(); i++) { 
          Rectangle bounds = contentPanel.getComponent(i).getBounds(); 
          preferredSize.width = Math.max(bounds.x + bounds.width, preferredSize.width); 
          preferredSize.height = Math.max(bounds.y + bounds.height, preferredSize.height); 
         } 
         Insets insets = contentPanel.getInsets(); 
         preferredSize.width += insets.right; 
         preferredSize.height += insets.bottom; 
         contentPanel.setMinimumSize(preferredSize); 
         contentPanel.setPreferredSize(preferredSize); 
        } 
       } 
       dialogPane.add(contentPanel, BorderLayout.CENTER); 

       { 
        buttonBar.setBorder(new EmptyBorder(12, 0, 0, 0)); 
        buttonBar.setLayout(new GridBagLayout()); 
        ((GridBagLayout)buttonBar.getLayout()).columnWidths = new int[] {0, 85, 80}; 
        ((GridBagLayout)buttonBar.getLayout()).columnWeights = new double[] {1.0, 0.0, 0.0}; 

        okButton.setText("Confirm"); 
        buttonBar.add(okButton, new GridBagConstraints(1, 0, 1, 1, 0.0, 0.0, 
         GridBagConstraints.CENTER, GridBagConstraints.BOTH, 
         new Insets(0, 0, 0, 5), 0, 0)); 

        cancelButton.setText("Cancel"); 
        buttonBar.add(cancelButton, new GridBagConstraints(2, 0, 1, 1, 0.0, 0.0, 
         GridBagConstraints.CENTER, GridBagConstraints.BOTH, 
         new Insets(0, 0, 0, 0), 0, 0)); 
       } 
       dialogPane.add(buttonBar, BorderLayout.SOUTH); 
      } 
      contentPane.add(dialogPane, BorderLayout.CENTER); 
      pack(); 
      setLocationRelativeTo(getOwner()); 
      setDefaultCloseOperation(2); 
      setModalityType(Dialog.ModalityType.APPLICATION_MODAL); 
      setVisible(true); 
      okButton.addActionListener(new ActionListener() 
      { 
       public void actionPerformed(ActionEvent ae) 
       { 
        write(pathname, includedExtension); 
        close(); 
       } 
      }); 
      cancelButton.addActionListener(new ActionListener() 
      { 
       public void actionPerformed(ActionEvent ae) 
       { 
        close(); 
       } 
      }); 
     } 

     private void write(String pathname, boolean includedExtension) 
       { 
      if(includedExtension) 
      { 
       try 
       { 
        BufferedWriter writer; 
        writer = new BufferedWriter(new FileWriter(pathname)); 
        writer.write(CWord.textArea1.getText()); 
        writer.close(); 
       } 
       catch(Exception e) 
       { 
        e.printStackTrace(); 
       } 
      } 
      else if(!includedExtension) 
      { 
       try 
       { 
        BufferedWriter writer; 
        writer = new BufferedWriter(new FileWriter(pathname + ".txt")); 
        writer.write(CWord.textArea1.getText()); 
        writer.close(); 
       } 
       catch(Exception e) 
       { 
        e.printStackTrace(); 
       } 
      } 
     } 
     private void close() 
     { 
      dispose(); 
      dispatchEvent(new WindowEvent(this, WindowEvent.WINDOW_CLOSING)); 
     } 

     private JPanel dialogPane; 
     private JPanel contentPanel; 
     private JLabel label1; 
     private JPanel buttonBar; 
     private JButton okButton; 
     private JButton cancelButton; 
    } 

Et l'une des lignes qui appellent cela dans CWord.class:

new AlreadyExists(this, file.getAbsolutePath(), file.getName(), true); 

Répondre

1

OK, ce fut une question difficile, mais j'ai finalement pensé à elle!

Voici votre problème. Vous ajoutez le ActionListener s aux boutons après vous appelez setVisible(true). Comme il s'agit d'une boîte de dialogue modale, setVisible(true) est un appel bloquant sur l'EDT. Cela signifie que le code après setVisible(true) n'est pas exécuté tant que le dialogue n'est pas fermé, de sorte que les ActionListener ne sont pas ajoutés au bouton tant que la boîte de dialogue n'est pas fermée.

Vous devez toujours avoir votre appel à setVisible() après que toute l'initialisation de l'interface graphique est effectuée lorsqu'il s'agit d'une boîte de dialogue modale. Il suffit donc de déplacer setVisible(true) après les appels à addActionListener sur les boutons, et vous serez prêt à partir.

0

Il n'y a absolument pas besoin de mettre en œuvre vos propres boîtes de dialogue.

plan votre code autour de ce lieu:

int choice = JOptionPane.showConfirmDialog(parentComponent, "Are you sure you want to overwrite?", "File Already Exists", JOptionPane.OK_CANCEL_OPTION); 

if(choice == JOptionPane.OK_OPTION){ 
    // okay 
} else { 
    // cancelled 
} 

En savoir plus ici:How to Make Dialog - Java Tutorial # Custom Button Text

+0

Mais, comment vérifier si cela avait été confirmé? Et, est-il possible de changer le texte sur les butttons? – condorcraft110

+0

Oui, donnez-moi une seconde, je vais éditer. – rtheunissen

+0

Merci. Mais, pouvez-vous changer le texte des JButtons? – condorcraft110