2010-01-23 63 views
5

我使用JOptionPane.showMessageDialog(null,e,“无效名称”,JOptionPane.ERROR_MESSAGE)方法来显示从Exception类扩展的异常。 但是,除非我按下Alt + Tab键,否则Pop窗口不会显示。可能是什么原因?以下是摘录。建议我一些东西。使用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

虽然你想从控制台程序没有进一步的gui显示JOptionPane有点令人困惑,但代码似乎工作正常。

我把它粘贴到我的IDE中,让它运行并正确显示相应输入上的选项窗格。我试着从命令提示符运行它,结果是一样的 - 代码运行良好,没有你描述的问题。

我建议尝试从命令提示符自己运行它。

+0

谢谢! :)我做了同样的事情,但它可能是与Windows操作系统相关的问题。 – Supereme

3

这个问题的最可能原因是您在showMessageDialog调用中传递null引用。虽然通过null作为第一个参数是好的,但它可能会导致像你面临的问题。 (另外我认为你在Windows上面临这个问题)。

要解决此问题(如果上述代码块是更大的GUI代码库的一部分),请在showMessageDiaglog的调用中传递父JFrame参考 (而不是null)。

另请参阅Java专家的新闻函的文章Finding Lost Frames,其中有关于此类问题的更多详细信息。

+0

谢谢你:),我读过这篇文章,它会帮助我很多! – Supereme

+0

应该是被接受的答案,因为代码保持接近原始实现+1 – Elazaron