使用JOptionPane时出现小问题

时间:2010-01-23 18:52:47

标签: java swing

我正在使用JOptionPane.showMessageDialog(null,e,“Invalid Name”,JOptionPane.ERROR_MESSAGE)方法来显示从Exception类扩展的异常。 但除非我按下Alt + tab,否则Pop窗口不会显示。可能是什么原因?以下是片段。建议我。

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)
}

3 个答案:

答案 0 :(得分: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之上。

答案 1 :(得分:3)

此问题的最可能原因是您在null的调用中传递了showMessageDialog引用。虽然传递null作为第一个参数很好,但可能会导致类似您所面临的问题。 (另外我认为你在Windows上遇到这个问题)。

解决此问题(如果上面的代码块是更大的GUI代码库的一部分)传递父JFrame引用 在您对showMessageDiaglog的调用中(而不是null)。

另请查看Java专家新闻信的文章Finding Lost Frames,其中包含有关此类问题的更多详细信息。

答案 2 :(得分:2)

虽然你想在没有更多gui的情况下从控制台程序显示JOptionPane有点令人费解,但代码似乎工作正常。

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

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