2013-07-22 41 views
1

我有一個活動或窗體,其中有一個文本框稱爲時間在這裏。正如這個論壇的專家所建議的,我使用runnable在從wifi接收數據時更新TextBox。更新多文本框Java GUI

我的疑問是當我想更新多個TextBox的時候該怎麼做。我應該使用可運行多塊像

   time1.post(new Runnable() { 
       @Override 
       public void run() { 
        time2.setText(s1); 
       } 
       }); 

      time2.post(new Runnable() { 
       @Override 
       public void run() { 
        time2.setText(s2); 
       } 
       }); 

      time3.post(new Runnable() { 
       @Override 
       public void run() { 
        time3.setText(s2); 
       } 
       }); 

或其他技術有更新多個文本框?我目前的代碼如下所示。

package com.example.cdttiming; 

public class MainActivity extends Activity 
{ 
    EditText time; 
    String s; 
    Button button; 
    byte[] buffer = new byte[65535]; 
    InetAddress ia = null; 
    byte[] bmessage = new byte[1500]; 
    DatagramPacket dp = new DatagramPacket(bmessage, bmessage.length); 
    MulticastSocket ms = null; 
    @Override 

    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main);  

     time = (EditText) findViewById(R.id.et_time); 
    try 
     { 
     WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
     WifiManager.MulticastLock multicastLock = wm.createMulticastLock("multicastLock"); 
     multicastLock.setReferenceCounted(true);   
     multicastLock.acquire();  

     ia = InetAddress.getByName("226.1.1.1");  
     try { 
      ms = new MulticastSocket(4321); 
      } catch (IOException e) { 
      e.printStackTrace(); 
      } 
     try { 
      ms.joinGroup(ia); 
      } catch (IOException e) { 
      e.printStackTrace(); 
      } 

     ms.setReuseAddress(true); 

     } 
      catch (UnknownHostException e)    { 
       time.setText(e.getMessage()); 

      } 
      catch (IOException e)    { 
       time.setText(e.getMessage()); 
      }  
    } 

    public void startProgress(View view) { 
     Runnable runnable = new Runnable() { 
      @Override 
      public void run() {    
     while(true)    { 
      try     { 
       // String str="This is test string"; 
        ms.receive(dp); 
        s = new String(dp.getData(),0,dp.getLength()); 
        char retval[] = s.toCharArray(); 
      } 
      catch (UnknownHostException e)     { 
       time.setText(e.getMessage()); 

       } 
       catch (IOException e)     { 
        time.setText(e.getMessage()); 
       }  

      ****////// My doubt is here if i have multple strings of data and multiple 
      /// multiple textboxes to update then what to do ???**** 

      time.post(new Runnable() { 
       @Override 
       public void run() { 
        time.setText(s); 

       } 
       }); 
      } // while 
      } 
     }; 
     new Thread(runnable).start(); 
     } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu)  { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 
} 
+0

1)請[接受](http://meta.stackexchange.com/a/65088/155831)你以前的問題的答案。 2)源代碼中的單個空白行是*總是*足夠! –

+0

*「PLZ建議。感謝ü所有提前」 *我建議你使用正確的拼寫像「你」,「你」和「請」字。這使人們更容易理解和幫助。 –

回答

0

你的代碼有點混亂。在主內一個案例循環要捕獲的數據,將其分配給一個字符串變量小號然後使用文本組件後()功能和的Runnable設置的EditText部件到值。但在同樣的循環你有異常處理程序,直接設置相同的EditText小部件。如果循環在定時器循環有機會觸發設定的文本呼叫之前重置值,則您的代碼也可能會丟失消息。

看起來您正在嘗試創建某種形式的實時系統,並且需要主要的循環來持續處理,並在數據可用時進行顯示。現在你有3個不同的消費者(文本小工具),但是你沒有提到你是否也有3個不同的消息源,或者是否仍然只有一個主處理循環,某種形式的選擇器將決定哪個文本小部件獲取消息?

如果我沿着這些路線構建了某些東西,我可能會使用消息傳遞系統並遵循生產者 - 消費者模型。當收到文本時,我會讓主處理循環將簡單的2字段消息推送到包含對文本小部件的引用和對數據字符串的引用的隊列中。因爲字符串在Java中是不可變的,一旦消息對象有其自己的文本複印件,到小號不會影響郵件進行任何更改。

然後,我將不得不消耗消息隊列後臺運行第二個線程。它會拉斷的消息隊列,構建一個調用與消息數據的目標文本組件,啓動它關閉,然後回去再取的下一條消息。

通過走這條路,你從UI更新處理分離的數據處理線程,就不必擔心您需要多少文本組件或其他部件進行更新。如果您需要添加其他人,只需要擔心創建更新消息的代碼知道新的小部件。執行小部件更新的線程不知道你有多少個小部件,它只是使用消息創建者說的使用更新消息對象中引用的那個。

+0

謝謝你的回覆。其實我只有一個主要的數據源字符串。這將被分成三部分,這三個子字符串將顯示在三個不同的文本框中 –

0

我建議你只創建一個可運行和主線程像這樣一次張貼:

 time1.post(new Runnable() { 
     @Override 
     public void run() { 
      time2.setText(s1); 
      time2.setText(s2); 
      time3.setText(s3); 
     } 
     }); 

需要創建一個可運行的,並張貼在一個視圖的主線程處理程序只關於在UI線程上運行一段代碼。無論你從哪裏獲得主線程處理器參考。

你也可以創建你的主線程處理程序如何:

protected void onCreate(Bundle savedInstanceState) 
{ 
     this.uiThrdHandler = new Handler(); 
} 

然後發佈可運行使用它:

this.uiThrdHandler.post(new Runnable(){ 
     ... 
}); 

當然也沒有必要創建另一個處理程序,但它是示範目的。

活動對象具有用於此目的的實用方法:runOnUiThread

使用它,這將是:

MainActivity.this.runOnUiThread (new Runnable() { 
     @Override 
     public void run() { 
      time2.setText(s1); 
      time2.setText(s2); 
      time3.setText(s3); 
     } 
     }); 

但同樣,結果是一樣的。