【问题标题】:JOptionPane and Scanner input issueJOptionPane 和扫描仪输入问题
【发布时间】:2012-12-01 20:31:41
【问题描述】:

我正在编写一个程序,有时我需要使用 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";

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

【问题讨论】:

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


    【解决方案1】:

    使用Scanner 操作在JOptionPane 使用的WaitDispatchSuport 类中创建一个块,用于检查非调度线程是否没有阻塞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);             
       }
    });
    

    【讨论】:

      【解决方案2】:

      这段代码sn-p可以帮到你

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 1970-01-01
        • 1970-01-01
        • 2021-05-14
        • 1970-01-01
        • 2017-09-04
        相关资源
        最近更新 更多