2010-01-23 7 views
5

Używam metody JOptionPane.showMessageDialog (null, e, "Invalid Name", JOptionPane.ERROR_MESSAGE) do wyświetlenia wyjątku rozszerzonego z klasy wyjątków. Ale okno Pop nie jest wyświetlane, dopóki nie naciśnie klawisza Alt + tab. Jaki może być powód? Poniżej znajduje się opis. Zaproponuj mi coś.Mały problem podczas korzystania z 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) 
} 

Odpowiedz

7

Miałem takie samo zachowanie na moim komputerze. Sztuką jest to, że musisz powiedzieć klasie JDialog, aby ustawiała się zawsze na wierzchu - co nie jest możliwe przy użyciu wygodnej statycznej metody showMessageDialog. Musimy więc ręcznie stworzyć JOptionPane i JDialog. Wystarczy dodać inną metodę statyczną do klasy 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); 
} 

i wywołanie tej metody zamiast JOptionPane.showMessageDialog. Działa na moim komputerze, komunikat o błędzie pojawia się tam, gdzie powinien: na moim IDE Eclipse.

+0

Dziękuję! :), próbowałem uruchomić powyższy kod. Zasadniczo dało mi to błąd dla metody "createDialog (String)", a następnie odnosząc się do dokumentacji Próbowałem dla createDialog (null, String), gdzie null oznacza element nadrzędny, którego nie ma w moim fragmencie. To działało dobrze. – Supereme

+1

Być może dlatego, że zastosowana przeze mnie metoda wygody została wprowadzona w Javie 1.6 –

2

Choć jest nieco zastanawiające, że chcesz wyświetlić JOptionPane z programu konsoli bez dalszego gui, kod wydaje się działać prawidłowo.

Wkleiłem go do mojego IDE, pozwoliłem mu działać i poprawnie wyświetliłem panel opcji na odpowiednim wejściu. Próbowałem uruchomić go z wiersza poleceń, a wynik był taki sam - kod działa poprawnie bez problemów, które opisujesz.

Proponuję spróbować uruchomić go z poziomu wiersza poleceń.

+0

Dziękujemy! :) Zrobiłem to samo, ale może to być problem związany z systemem Windows. – Supereme

3

Najbardziej prawdopodobną przyczyną tego problemu jest podanie numeru null w wywołaniu showMessageDialog. Choć podanie pierwszego parametru jest zbyt dobre, prawdopodobnie spowoduje to problemy podobne do tego, z którym się spotykasz. (Również myślę, że masz do czynienia z tym problemem w systemie Windows).

Aby rozwiązać ten problem (jeśli powyższy fragment kodu należy do większej bazy kodu GUI), należy podać macierzystą wartość odniesienia JFrame (zamiast wartości zerowej) w swoim połączeniu z numerem showMessageDiaglog.

Należy również zapoznać się z artykułem Finding Lost Frames w liście informacyjnym Java Specialist, zawierającym więcej szczegółów na temat tego rodzaju problemu.

+0

Dziękuję :), przeczytałem artykuł i pomoże mi to dużo! – Supereme

+0

powinna być akceptowaną odpowiedzią, ponieważ kod pozostaje bliżej oryginalnej implementacji +1 – Elazaron

Powiązane problemy