2012-12-13 105 views
2

我正在編寫一個程序,在某一點上,我需要使用JOptionPane在窗口上打印字符串。該行的代碼看起來是這樣的:JOptionPane和掃描儀輸入問題

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

行getName功能指的是我創建的具有返回字符串的方法的對象。然而,當我的代碼達到這一點時,程序似乎進入某種無限循環,因爲窗口永遠不會彈出,並且在使用調試時,它看起來永無止境。

最重要的是,當我使用getName時,我允許用戶在主驅動程序中使用不同的函數設置此名稱。

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

我的setName()函數的代碼基本上是:

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

名稱是在類私有變量。 close()不是必需的,但我試圖看看它是否有任何作用。

我注意到的是,如果我使用上面的代碼,窗口永遠不會彈出,並且我陷入了無限循環。但是,如果我只是名稱=行改變任何東西,如:

name = "foo"; 

的代碼運行平穩,窗口彈出,我不陷入一個循環。即使我在程序提示時未輸入名稱,導致產生空字符串,窗口仍然不會彈出。任何人都可以幫助並告訴我爲什麼會發生這種情況?謝謝。

回答

1

使用Scanner操作在WaitDispatchSuport類中創建了一個由JOptionPane使用的類,它檢查非分派線程是否阻塞IO。調用Scanner.close()不會取消阻塞該線程。

一種解決方法是調用showMessageDialogEDT

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