2010-01-23 18 views
5

Sto utilizzando il metodo JOptionPane.showMessageDialog (null, e, "Nome non valido", JOptionPane.ERROR_MESSAGE) per visualizzare l'eccezione estesa dalla classe Exception. Ma la finestra Pop non viene visualizzata a meno che e fino a quando premo Alt + tab. Quale può essere il motivo? Di seguito è riportato lo snippet. Suggeriscimi qualcosaPiccolo problema durante l'utilizzo di 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) 
} 

risposta

7

Ho avuto lo stesso comportamento sulla mia macchina. Il trucco è che devi dire alla classe JDialog di impostarsi sempre in primo piano, il che non è possibile con l'utilizzo del conveniente metodo statico showMessageDialog. Quindi dobbiamo creare JOptionPane e JDialog a mano. Basta aggiungere un altro metodo statico alla 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); 
} 

e chiamare questo metodo al posto del JOptionPane.showMessageDialog. Funziona sulla mia macchina, il messaggio di errore appare dove dovrebbe: sopra il mio IDE eclissi.

+0

Grazie! :), ho provato a eseguire il codice precedente.Inizialmente mi ha dato errore per metodo "createDialog (String)" quindi facendo riferimento alla documentazione Ho provato per createDialog (null, String) dove null sta per componente padre che non è presente nel mio frammento. Ha funzionato bene. – Supereme

+1

Forse perché il metodo di convenienza che ho usato è stato introdotto con Java 1.6 –

2

Anche se è un po 'sconcertante che si desidera visualizzare un JOptionPane da un programma di console senza ulteriori gui, il codice sembra funzionare bene.

L'ho incollato nel mio IDE, l'ho lasciato girare e ha mostrato correttamente i riquadri delle opzioni sull'ingresso corrispondente. Ho provato a eseguirlo da un prompt dei comandi e il risultato è stato lo stesso - il codice funziona bene senza i problemi che descrivi.

Suggerisco di provare ad eseguirlo da un prompt dei comandi.

+0

Grazie! :) Ho fatto lo stesso, ma potrebbe essere il problema relativo a Windows OS. – Supereme

3

La causa più probabile di questo problema è che si sta passando un riferimento null nella chiamata a showMessageDialog. Anche se passare null come primo parametro va bene, è probabile che causi problemi come quello che stai affrontando. (Anche io penso che tu stia affrontando questo problema su Windows).

Per risolvere questo problema (se il suddetto blocco di codice fa parte del codice più ampio della base di codice della GUI) passare il riferimento JFrame principale (anziché null) nella chiamata a showMessageDiaglog.

Controllare anche l'articolo Finding Lost Frames della lettera di notizie di Java Specialist che contiene ulteriori dettagli su questo tipo di problema.

+0

Grazie :), ho letto l'articolo e mi aiuterà molto! – Supereme

+0

dovrebbe essere la risposta accettata perché il codice rimane più vicino all'implementazione originale +1 – Elazaron

Problemi correlati