2

ある時点で、JOptionPane を使用してウィンドウに文字列を出力する必要があるプログラムを作成しています。この行のコードは次のようになります。

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

getName 関数は、文字列を返すメソッドを持つ、私が作成したオブジェクトを参照します。ただし、私のコードがこのポイントに達すると、ウィンドウが決してポップアップせず、デバッグを使用しているときに無限ループに陥っているように見えます。

主なことは、getName を使用するときに、ユーザーがメイン ドライバーの前に別の関数を使用してこの名前を設定できるようにすることです。

getName() は基本的に 1 行で、名前を返します。

私の setName() 関数のコードは基本的に次のとおりです。

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

名前はクラスのプライベート変数です。close() は必須ではありませんが、効果があるかどうか試してみました。

私が気付いたのは、上記のコードを使用すると、ウィンドウがポップアップせず、無限ループに陥ることです。ただし、 name = 行を次のように単純に変更すると、次のようになります。

name = "foo";

コードはスムーズに実行され、ウィンドウがポップアップし、ループに陥ることはありません。プログラムから名前を入力するように求められたときに名前を入力しなくても、null 文字列になり、ウィンドウはまだポップアップしません。なぜこれが起こっているのか、誰でも助けてアドバイスできますか? ありがとう。

4

2 に答える 2

1

操作を使用すると、使用されるクラスScannerにブロックが作成され、非ディスパッチ スレッドがブロッキング IO から解放されることがチェックされます。呼び出してもスレッドのブロックは解除されません。WaitDispatchSuportJOptionPaneScanner.close()

showMessageDialog1 つの解決策は、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 に答える