2010-01-23 5 views
5

J'utilise la méthode JOptionPane.showMessageDialog (null, e, "Invalid Name", JOptionPane.ERROR_MESSAGE) pour afficher l'exception étendue à partir de la classe Exception. Mais la fenêtre Pop ne s'affiche pas tant que je n'appuie pas sur Alt + Tab. Quelle peut être la raison? Voici l'extrait. Propose-moi quelque chose.Petit problème lors de l'utilisation de JOptionPane

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

class NameInvalidException extends Exception { 
    /** 
    * Invalid Name 
    */ 
    String invName; 

    public NameInvalidException() { 
     super(); 
    } 

    public NameInvalidException(String s) { 
     invName = s; 
    } 

} 

class SmallException extends Exception { 
    /** 
    * Short Name 
    */ 
    String sName; 

    public SmallException() { 
     super(); 
    } 

    public SmallException(String s) { 
     sName = s; 
    } 

} 

public class ValidName { 
    public static void main(String arr[]) { 
     try { 
      BufferedReader br = new BufferedReader(new InputStreamReader(
        System.in)); 
      System.out.println("Enter the name: "); 

      String name = br.readLine(); 
      checkName(name); 
     } catch (IOException e) { 
      System.out.println(e); 
     } 

    }// end main 

    static void checkName(String name) { 

     try { 

      String sarr[] = name.split(" "); 
      if (sarr.length != 3) 
       throw new SmallException(name); 
      for (int j = 0; j < 3; j++) { 
       System.out.println("in j loop"); 
       if (sarr[j].length() < 3) { 
        throw new SmallException(); 
       } 
      } 
      for (int i = 0; i < name.length(); i++) { 

       char ch = name.charAt(i); 
       if (Character.isLetter(ch) || Character.isWhitespace(ch)) 
        System.out.println("ok " + ch); 
       else 
        throw new NameInvalidException(); 

      }// end for 
     }// end try 
     catch (NameInvalidException e) { 
      JOptionPane.showMessageDialog(null, e.toString(), "Invalid Name", 
        JOptionPane.ERROR_MESSAGE); 
      System.out.println(e); 
     } catch (SmallException es) { 
      JOptionPane.showMessageDialog(null, es.toString(), "Invalid Name", 
        JOptionPane.ERROR_MESSAGE); 

     } 
    }// end checkName(name) 
} 

Répondre

7

J'ai eu le même comportement sur ma machine. L'astuce est que vous devez indiquer à la classe JDialog de se placer toujours en haut - ce qui n'est pas possible avec la méthode statique pratique showMessageDialog. Nous devons donc créer le JOptionPane et le JDialog à la main. Il suffit d'ajouter une autre méthode statique à la classe validName:

private static void showErrorPane(String message, String title) { 
    JOptionPane pane = new JOptionPane(message, JOptionPane.ERROR_MESSAGE); 
    JDialog dialog = pane.createDialog(title); 
    dialog.setAlwaysOnTop(true); 
    dialog.setVisible(true); 
} 

et appeler cette méthode au lieu du JOptionPane.showMessageDialog. Cela fonctionne sur ma machine, le message d'erreur apparaît où il devrait: sur mon IDE Eclipse.

+0

Merci! :), j'ai essayé d'exécuter le code ci-dessus.Initialement, il m'a donné une erreur pour la méthode "createDialog (String)" puis en se référant à la documentation J'ai essayé pour createDialog (null, String) où null représente le composant parent qui n'est pas présent dans mon extrait. Cela a bien fonctionné. – Supereme

+1

Peut-être parce que la méthode de commodité que j'ai utilisée a été introduite avec Java 1.6 –

2

Bien qu'il soit un peu déroutante que vous voulez afficher un JOptionPane d'un programme de console sans IUG De plus, le code semble fonctionner très bien. Je l'ai collé dans mon EDI, l'ai laissé s'exécuter et il a montré correctement les panneaux d'option sur l'entrée correspondante. J'ai essayé de l'exécuter à partir d'une invite de commande et le résultat était le même - le code fonctionne bien sans les problèmes que vous décrivez.

Je suggère de l'exécuter vous-même à partir d'une invite de commande.

+0

Merci! :) J'ai fait la même chose mais ce pourrait être le problème lié à Windows OS. – Supereme

3

La cause la plus probable de ce problème est que vous transmettez une référence null dans l'appel à showMessageDialog. Bien que passer le null comme premier paramètre soit correct, il est susceptible de causer des problèmes comme celui que vous rencontrez. (Aussi je pense que vous êtes confronté à ce problème sur Windows). Pour résoudre ce problème (si le fragment de code ci-dessus fait partie de votre base de code GUI), passez la référence JFrame parent (au lieu de null) dans votre appel à showMessageDiaglog.

Consultez également l'article Finding Lost Frames de la lettre de nouvelles de Java Specialist, qui contient plus de détails sur ce type de problème.

+0

Merci :), j'ai lu l'article et il va m'aider beaucoup! – Supereme

+0

devrait être la réponse acceptée car le code reste plus proche de l'implémentation d'origine +1 – Elazaron