JOptionPane和Scanner输入问题

时间:2012-12-13 21:09:37

标签: java string window java.util.scanner joptionpane

我正在编写一个程序,我需要在一个窗口上使用JOptionPane打印一个String。该行的代码如下所示:

JOptionPane.showMessageDialog(null, "Name: " + a.getName());

getName函数指的是我创建的具有返回String的方法的对象。但是,当我的代码达到这一点时,程序似乎进入某种无限循环,因为窗口永远不会弹出,当使用调试时,它似乎永无止境。

最重要的是,当我使用getName时,我允许用户在主驱动程序中先前使用不同的函数设置此名称。

getName()基本上是一行,返回名称;

我的setName()函数的代码基本上是:

Scanner a = new Scanner(System.in);
System.out.print("Pick a name: ");
name = in.nextLine();
a.close();

Name是类中的私有变量。 close()不是必需的,但我试着看它是否有任何影响。

我注意到的是,如果我使用上面的代码,窗口永远不会弹出,我陷入无限循环。但是,如果我只是将name =行更改为任何内容,例如:

name = "foo";

代码运行顺畅,窗口弹出,我不会陷入循环。即使我在程序提示我时没有输入名称,导致null String,窗口仍然不会弹出。任何人都可以帮助并告诉我为什么会这样吗?感谢。

2 个答案:

答案 0 :(得分:1)

使用Scanner操作会在WaitDispatchSuport使用的JOptionPane类中创建一个块,该类检查非分派线程是否可以阻止IO。调用Scanner.close()不会解除阻塞线程。

一种解决方案是从EDT

致电showMessageDialog
Scanner a = new Scanner(System.in);
System.out.print("Pick a name: ");
final String name = a.nextLine();

SwingUtilities.invokeLater(new Runnable() {

   @Override
   public void run() {
      JOptionPane.showMessageDialog(null, "Name: " + name);             
   }
});

答案 1 :(得分:0)

此代码段可以帮助您

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        final String s = scanner.nextLine();
        SwingUtilities.invokeLater(() -> {
            JDialog dialog = new JDialog();
            dialog.setAlwaysOnTop(true);
            JOptionPane.showMessageDialog(dialog, s);
        });
}