2012-05-08 84 views
2

我試圖使用apache wicket創建類似只讀控制檯窗口的東西。 本質上,用戶提交表單以啓動服務器端操作。然後可以跟蹤頁面上的作業輸出。使用wicket更新文本區域

我目前顯示輸出,如下所示:

public class ConsoleExample extends WebPage { 

protected boolean refreshing; 
private String output = ""; 

public void setOutput(String newOutput) { 
    synchronized (this) { 
     output = newOutput; 
    } 
} 

public void appendOutput(String added) { 
    synchronized (this) { 
     this.output = output+added; 
    } 
} 

public ConsoleExample() { 

    Form<ConsoleExample> form = new Form<ConsoleExample>("mainform"); 
    add(form); 
     final TextArea<String> outputArea = new TextArea<String>("output", 
      new PropertyModel<String>(this, "output")); 
    outputArea.setOutputMarkupId(true); 
    // A timer event to add the outputArea to the target, triggering the refresh 
    outputArea.add(new AbstractAjaxTimerBehavior(Duration.ONE_SECOND){ 
     private static final long serialVersionUID = 1L; 
     @Override 
     protected void onTimer(AjaxRequestTarget target) { 
      synchronized (this) { 
       if(refreshing){ 
        target.focusComponent(null); 
        target.addComponent(getComponent()); 
       } 
      } 
     } 

    }); 

    add(outputArea); 

    form.add(new AjaxSubmitLink("run") { 
     private static final long serialVersionUID = 1L; 

     @Override 
     public void onSubmit(final AjaxRequestTarget target, Form<?> form) { 
      setOutput(""); 
      new Thread(new Runnable() { 
       @Override 
       public void run() { 
        try { 
         refreshing = true; 
         ProcessBuilder pb = new ProcessBuilder(Collections.singletonList("execute")); 
         pb.redirectErrorStream(true); 
         String line; 
         BufferedReader br = new BufferedReader(new InputStreamReader(pb.start().getInputStream())); 
         while ((line = br.readLine()) != null) { 
          appendOutput("\n" + line); 
         } 
        } catch (IOException e) { 
         //... 
        } finally { 
         //... 
         refreshing = false; 
        } 
       } 
      }).start(); 
     } 
    }); 
} 

這種解決方案的問題是每次AjaxTimerBehaviorRuns刷新復位文本區域的屬性,即,光標位置和滾動位置。 因此,隨着輸出的增加,用戶無法跟蹤輸出,因爲textarea會跳回每秒開始。

有沒有更好的方法來實現這一目標?

+0

我認爲你可以添加一個JavaScript函數的行爲,刷新後,滾動文本視圖一路下來。我不知道怎麼做,所以我沒有把它作爲答案。 –

回答

0

部分解決 使用,我只是增加了一些JavaScript追加新文本appendJavaScript()函數的jordeu的建議繼最後更新。

這解決了滾動問題,但任何用戶選擇仍然重置。 此外,它似乎不是一個「好」的解決方案給我。

有關如何改進的進一步建議,歡迎光臨。

0

一個更多鈔票容易實現的方法是添加一個隱藏TextField您更新與AjaxTimerBehavior拋AJAX,然後調用同步隱藏TextField與您<textarea>值的JavaScript函數(使用AjaxRequestTarget.appendJavaScript())。

protected void onTimer(AjaxRequestTarget target) { 
    synchronized (this) { 
     if(refreshing){ 
      if(update != null){ 
       target.appendJavascript("var obj=document.getElementById(\"output\");var txt=document.createTextNode(\""+update+"\");obj.appendChild(txt)"); 
       update = null; 
      } 
     } 
    } 
} 

update場是因爲任何新的案文:

+0

有趣的解決方案。我有點擔心如何處理同步問題,但我會放棄它。 – Jim