2010-01-23 33 views
5

Estoy usando el método JOptionPane.showMessageDialog (null, e, "Nombre no válido", JOptionPane.ERROR_MESSAGE) para mostrar la excepción extendida desde la clase Excepción. Pero la ventana Pop no se muestra a menos que y hasta que presione Alt + tab. cual puede ser la razon? A continuación se muestra el fragmento. Sugerirme algoPequeño problema al utilizar 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) 
} 

Respuesta

7

Tuve el mismo comportamiento en mi máquina. El truco es que tienes que decirle a la clase JDialog que se establezca siempre en la parte superior, lo que no es posible con el uso del conveniente método static showMessageDialog. Entonces tenemos que crear el JOptionPane y el JDialog a mano. Sólo tiene que añadir otro método estático de la clase 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); 
} 

y llamar a este método en lugar de la JOptionPane.showMessageDialog. Funciona en mi máquina, el mensaje de error aparece donde debería: en la parte superior de mi eclipse IDE.

+0

¡Gracias! :), traté de ejecutar el código anterior. Inicialmente, me dio error para el método "createDialog (String)" y luego refiriéndome a la documentación Intenté con createDialog (null, String) donde null representa el componente principal que no está en mi fragmento. Funcionó bien – Supereme

+1

Tal vez porque el método de conveniencia que utilicé se introdujo con Java 1.6 –

2

Si bien es un tanto desconcertante que desea mostrar un JOptionPane de un programa de consola sin más interfaz gráfica de usuario, el código parece funcionar bien.

Lo pegué en mi IDE, lo dejé correr y mostró correctamente los paneles de opciones en la entrada correspondiente. Intenté ejecutarlo desde un símbolo del sistema y el resultado fue el mismo: el código funciona bien sin los problemas que describes.

Sugiero tratar de ejecutarlo desde un símbolo del sistema usted mismo.

+0

¡Gracias! :) Hice lo mismo, pero podría ser el problema relacionado con Windows OS. – Supereme

3

La causa más probable para este problema es que está pasando una referencia null en la llamada al showMessageDialog. Aunque pasar null como primer parámetro es correcto, es probable que cause problemas como el que está enfrentando. (También creo que enfrenta este problema en Windows).

Para solucionar este problema (si el fragmento de código anterior es parte de su base de código GUI más grande) pase la referencia padre JFrame (en lugar de nulo) en su llamada al showMessageDiaglog.

Consulte también el artículo Finding Lost Frames de la carta informativa de Java Specialist, que contiene más detalles sobre este tipo de problema.

+0

Gracias :), ¡leí el artículo y me va a ayudar mucho! – Supereme

+0

debería ser la respuesta aceptada porque el código se mantiene más cercano a la implementación original +1 – Elazaron

Cuestiones relacionadas