Небольшая проблема при использовании JOptionPane - PullRequest
5 голосов
/ 23 января 2010

Я использую метод JOptionPane.showMessageDialog (null, e, «Неверное имя», JOptionPane.ERROR_MESSAGE) для отображения исключения, расширенного из класса Exception. Но всплывающее окно не отображается, пока я не нажму Alt + Tab. В чем может быть причина? Ниже приведен фрагмент. Предложите мне что-нибудь.

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 ]

7 голосов
/ 24 января 2010

У меня было такое же поведение на моей машине. Хитрость заключается в том, что вы должны указать классу 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. Он работает на моей машине, сообщение об ошибке появляется там, где должно: поверх моей IDE затмения.

3 голосов
/ 23 января 2010

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

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

Также проверьте статью Поиск потерянных фреймов в новостном письме Java-специалиста, в котором есть некоторые подробности об этой проблеме.

2 голосов
/ 23 января 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...