2010-01-23 7 views
5

Я использую метод JOptionPane.showMessageDialog (null, e, "Invalid Name", JOptionPane.ERROR_MESSAGE) для отображения исключения, расширенного из класса исключений. Но окно Pop не отображается, пока и до тех пор, пока я не нажму Alt +. В чем причина? Ниже приведен фрагмент. Предложите мне что-нибудь.Небольшая проблема при использовании 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) 
} 

ответ

7

У меня было такое же поведение на моей машине. Хитрость заключается в том, что вы должны сказать классу JDialog, чтобы он всегда устанавливался сверху - что невозможно при использовании удобного статического метода showMessageDialog. Поэтому мы должны создать JOptionPane и JDialog вручную. Просто добавьте еще один статический метод класса 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); 
} 

и называют этот метод вместо JOptionPane.showMessageDialog. Он работает на моей машине, появляется сообщение об ошибке, где оно должно: поверх моей Eclipse IDE.

+0

Спасибо! :), я попытался запустить вышеуказанный код. Вначале он дал мне ошибку для метода «createDialog (String)», а затем, ссылаясь на документацию Я попытался создать createDialog (null, String), где null означает родительский компонент, которого нет в моем фрагменте. Он работал хорошо. – Supereme

+1

Возможно, потому что метод удобства, который я использовал, был представлен с Java 1.6 –

2

Хотя это несколько озадачивает, что вы хотите, чтобы отобразить JOptionPane из консольной программы без дальнейшего графического интерфейса, код, кажется, работает хорошо.

Я вставил его в свою IDE, дайте ему запустить, и он правильно показал панели параметров на соответствующем входе. Я попробовал запустить его из командной строки, и результат был тот же - код работает отлично без проблем, которые вы описываете.

Я предлагаю попробовать запустить его из командной строки самостоятельно.

+0

Спасибо! :) Я сделал то же самое, но это может быть проблема, связанная с окнами os. – Supereme

3

Скорее всего, причиной этой проблемы является то, что вы передаете ссылку null при вызове showMessageDialog. Хотя передача null в качестве первого параметра в порядке, это может вызвать проблемы, подобные тому, с которым вы сталкиваетесь. (Также я думаю, что вы столкнулись с этой проблемой в Windows).

Чтобы устранить эту проблему (если вышеуказанный фрагмент кода является частью вашей большей базы графического интерфейса пользователя), передайте родительскую ссылку JFrame (вместо нулевого) в своем обращении к showMessageDiaglog.

Также проверьте статью Finding Lost Frames новостного письма специалиста Java, в котором есть более подробная информация об этом виде проблемы.

+0

Спасибо, я прочитал статью, и это поможет мне много! – Supereme

+0

должен быть принятым ответом, потому что код остается ближе к первоначальной реализации +1 – Elazaron

Смежные вопросы