2012-03-12 82 views
1

我調用一個創建jframe的類並等待用戶輸入一些值。 我遇到的問題是我需要等待這些值才能繼續。 因此,代碼是簡單的東西像這樣Java。如何等待?

Jframe frame= new jframe(); //here I want the program to show the frame and then wait till it will be disposed 
// I want a pause here 
System.out.println(frame.getvalue); 

到目前爲止唯一我能做的就是凍結幀之前甚至可以出現完全。 有什麼幫助嗎? 請保持簡單,因爲我是Java新手。 謝謝!

+0

感謝您的編輯! – Vagelism 2012-03-12 14:25:50

+2

爲什麼你不等待點擊事件或什麼?等待一段時間從盒子收集數據是一種糟糕的設計方法。 – Max 2012-03-12 14:28:36

+0

您不能在textArea或xxx上使用用戶輸入數據的偵聽器,並且在輸入完成後觸發相關操作? – assylias 2012-03-12 14:29:12

回答

10

我認爲你應該使用的,而不是JFrame中的JDialog。請按照此example

+0

鏈接死了,喲。 – 2014-01-24 14:23:15

-3

這將導致當前線程等待5秒鐘:

try { 
    Thread.currentThread().wait(5000); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 
} 
+0

那麼,如果用戶例如需要6秒輸入我需要稍後提取的數據呢? – Vagelism 2012-03-12 14:27:14

+1

所以你不想等待,你想知道用戶何時輸入數據? – Kylar 2012-03-12 14:27:55

+0

您需要添加某種按鈕或事件偵聽器才能知道它們何時完成。你應該閱讀Swing教程。特別是事件監聽器位:http://docs.oracle.com/javase/tutorial/uiswing/events/index.html – Kylar 2012-03-12 14:28:44

0

以及你知道Swing組件不是線程安全的,雖然你可以使用SwingWorker要在後臺等待,

它使用線程方式,但它爲等待長期操作(通常爲 )創建一個新線程,而不是暫停事件分派線程,以便用戶可以與應用程序的其餘部分交互,或者應用程序的其餘部分可以在等待繼續時繼續工作。

你必須定義一種方法來阻止等待。

退房它的文檔在這裏http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html

+0

這就是我現在閱讀關於線程等一週的內容......我從現在開始一直在與他們合作,只在同一個框架內工作,而不是父母和子框架。謝謝! – Vagelism 2012-03-12 14:57:09

+0

以及我認爲SwingWorker不關心這個問題,因爲在EDT中不會調用它,而是創建它自己的執行線程,然後在EDT上追加結果並將執行返回給EDT。 – engma 2012-03-12 16:15:34

5

你可能要找的是JOptionPane。這是一個阻塞例程返回用戶輸入某個值後,才,就像這樣:

public class test 
{ 
    public static void main (String args[]) 
    { 
     String input = JOptionPane.showInputDialog(null, "Thing: ", 
        "Enter Stuff", JOptionPane.OK_CANCEL_OPTION); 

     System.out.println ("won't reach until got input"); 
     System.out.println ("My value: " + input); 
    } 
} 

關於它的偉大的事情是,你可以將組件添加到它,這樣你就不會侷限於單一的輸入字段,但它仍然阻塞。以下內容將在框架中添加兩個JTextField:

public class test 
{ 
    public static void main (String args[]) 
    { 
     JTextField input_box = new JTextField(7); 
     JTextField input_box2 = new JTextField(7); 

     JComponent[] inputs = new JComponent[] { 
      new JLabel("Thing 1:"), 
      input_box, 
      new JLabel("Thing 2:"), 
      input_box2 }; 

     int rval = JOptionPane.showConfirmDialog(null, inputs, 
        "Enter Stuff", JOptionPane.OK_CANCEL_OPTION); 

     if (rval == 0) 
     { 
      System.out.printf ("%s and %s!", input_box.getText(), 
             input_box2.getText()); 
     } 
    } 
}