2

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

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

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

主要的是,当我使用 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";

代码运行流畅,弹出窗口,我没有陷入循环。即使在程序提示我时我没有输入名称,导致空字符串,窗口仍然没有弹出。任何人都可以帮助和建议我为什么会这样吗?谢谢。

4

2 回答 2

1

使用操作在使用的类Scanner中创建一个块,用于检查非调度线程是否不受阻塞 IO 的影响。调用不会解除阻塞线程。WaitDispatchSuportJOptionPaneScanner.close()

showMessageDialog一种解决方案是从EDT调用:

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);             
   }
});
于 2012-12-17T00:00:33.987 回答
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);
        });
}
于 2017-08-13T07:34:35.443 回答