2011-08-29 11 views
6

私は、コンソールアプリケーションをSwingを使用するものに変換しています。現時点で私のプログラムはこれと同様のことをしたいです.nextInt();.getText();または類似のものを使ってどうすればいいですか?テキストフィールドの入力を待つ方法は?

要するに、

ユーザーがテキストフィールドに何かを入力してEnterを押すまで、プログラムの実行を保持する方法を教えてください。

+0

質問がまだ分かりません - 「実行を保留」とはどういう意味ですか?それとは別に:基本的なSwingチュートリアルとテキストフィールドのAPIドキュメントを読んでください(ヒント:setActionは一見価値があります:-) – kleopatra

答えて

5

更新:したがって、ユーザーがGUIから何かを入力するまで待つ必要があります。これは可能ですが、に同期する必要があります。GUIは別のスレッドで実行されるためです。

だから手順は次のとおり

  1. は「論理」スレッド
  2. holder.wait()を使用して)入力するための「論理」スレッドが待機
  3. にGUIから結果をdeligates「ホルダ」オブジェクトを作成します
  4. ユーザーがテキストを入力すると、「所有者」オブジェクトが同期化され、結果に+論理スレッド(holder.notify())が通知されます
  5. 「論理」スレッドはロックから解放され、処理が続行されます。

全例:

public static void main(String... args) throws Exception { 
    final List<Integer> holder = new LinkedList<Integer>(); 

    final JFrame frame = new JFrame("Test"); 

    final JTextField field = new JTextField("Enter some int + press enter"); 
    frame.add(field); 
    field.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      synchronized (holder) { 
       holder.add(Integer.parseInt(field.getText())); 
       holder.notify(); 
      } 
      frame.dispose(); 
     } 
    }); 

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.pack(); 
    frame.setVisible(true); 

    // "logic" thread 
    synchronized (holder) { 

     // wait for input from field 
     while (holder.isEmpty()) 
      holder.wait(); 

     int nextInt = holder.remove(0); 
     System.out.println(nextInt); 
     //.... 
    } 
} 
+0

更新された質問をチェックしてください。 – Derek

+0

@Deza:完全な例で更新しました.. – dacwe

+1

約6年後、ありがとうございます!素晴らしい例。 – DCON

0

コンソールアプリケーションとGUIアプリケーションが動作中はかなり異なっています。コンソールアプリケーションはコマンドライン引数から入力を受け取り、GUIアプリケーションがイベントメカニズムによって駆動されている間にキーボードから入力されたユーザ入力を待って、タスクを実行します。

たとえば、TextFieldオブジェクトをフレームに追加し、テキストフィールドオブジェクトにkeyListenerを追加します。リスナーは、キーイベントが通知されたときに呼び出されます。そこには多くの例があります。公式のJavaの例http://download.oracle.com/javase/tutorial/uiswing/events/keylistener.html

関連する問題