2013-08-29 68 views
0

我有一個表單,用戶可以在幾個文本框中輸入信息。GWT捕獲文本框加載事件

文本框創建像這樣 -

GroupSection courseNumber = new GroupSection(getH4Title("")); 
courseNumber.addStyleName(LUUIConstants.STYLE_SECTION); 
courseNumber.addStyleName(LUUIConstants.STYLE_SECTION_DIVIDER); 

// KSTextBox extends TextBox incidentally 
// I've added some custom functionality in my version of this class 
KSTextBox subjectCodeTextBox = new KSTextBox(); 
KSTextBox courseNumberTextBox = new KSTextBox(); 
. 
. 
. 
addField(courseNumber, 
     COURSE + "/" + SUBJECT_AREA, 
     generateMessageInfo(LUUIConstants.SUBJECT_CODE_LABEL_KEY), 
     subjectCodeTextBox); 
addField(courseNumber, 
     COURSE + "/" + COURSE_NUMBER_SUFFIX, 
     generateMessageInfo(LUUIConstants.COURSE_NUMBER_LABEL_KEY), 
     courseNumberTextBox); 
. 
. 
. 
courseNumber.addSection(generateCrossListed_Ver_Joint_Section()); 
return courseNumber; 

這裏是什麼樣子呈現: 2 Text boxes

對這些文本框是位於我在應用程序中重新使用這同一個頁面不同的場景;然而,對於一個特定的場景,我需要讓它們成爲只讀的。

我發現這種情況的方式是檢查頁面的標題。如果頁面上有關鍵字「修改」 - 我不希望用戶能夠更改這些文本框中正在自動填充的值。

我已經幾乎實現此實現這一點 -

subjectCodeTextBox.addBlurHandler(new BlurHandler() { 

    @Override 
    public void onBlur(BlurEvent blurEvent) { 
    NodeList<Element> elements = Document.get().getElementsByTagName("div"); 
    for (int i = 0; i < elements.getLength(); i++) { 
     Element elem = elements.getItem(i); 
     String innerHTML = elem.getInnerHTML(); 
     if (innerHTML.contains("Modify")) { 
     subjectCodeTextBox.setReadOnly(true); 
     courseNumberTextBox.setReadOnly(true); 
     } 
     break; 
    } 
    } 
}); 

courseNumberTextBox.addBlurHandler(new BlurHandler() { 

    @Override 
    public void onBlur(BlurEvent blurEvent) { 
    NodeList<Element> elements = Document.get().getElementsByTagName("div"); 
    for (int i = 0; i < elements.getLength(); i++) { 
     Element elem = elements.getItem(i); 
     String innerHTML = elem.getInnerHTML(); 
     if (innerHTML.contains("Modify")) { 
     subjectCodeTextBox.setReadOnly(true); 
     courseNumberTextBox.setReadOnly(true); 
     } 
     break; 
    } 
    } 
}); 

上面的代碼工作,但它只會火在用戶點擊了,然後這些2個一個文本框出來後。但到那時,他們可能已經改變了價值觀,並且不想那樣做 - 我希望這些框在頁面首次呈現時被禁用。

如何在頁面首次呈現給用戶時將這些文本框設置爲READONLY?

我認爲它與ONLOAD事件有關,但是如何正確設置它?

+0

我必須錯過一些東西 - 你爲什麼要把它放在模糊處理程序中,而不是立即調用它,或者只要在頁面上實際添加了「修改」關鍵字就會調用它?你不能把它們設置爲只讀嗎? –

+0

這是使用MVC和Spring的企業應用程序的一部分。 rootPanel存在於應用程序的其他地方。這個特定的類只返回一個小段(Section)。這個頁面在幾種情況下使用 - 修改,創建和退出。 Modify關鍵字被插入到另一個沒有引用這些文本框的部分中的完全不同的類中。它必須在這裏發生。 –

回答

0

你可以嘗試編碼類似:

AttachEvent.Handler attachHandler = new AttachEvent.Handler() { 

     @Override 
     public void onAttachOrDetach(AttachEvent event) { 
      if (makeUnreadable) { 
       box.setReadOnly(true); 
       box.setReadOnly(true); 
      } 
     } 
}; 
courseNumberTextBox.addAttachHandler(attachHandler); 
subjectCodeTextBox.addAttachHandler(attachHandler); 

你可以看到,我使用「makeUnreadable」標誌,你可以以自己的方式計算,但必須經過「格來計算「與」修改「文本被附加到DOM。

除此之外,imho決定是否讓盒子可讀的方式是一點點的解決方法。想象一下,將來不會有「修改」文本,但「編輯」 - 那麼你的代碼將無法工作。向您的應用程序添加其他語言支持時也會發生同樣的情況。也許你可以找出另一種告訴應用程序的方式,那些字段應該是不可讀的?

+0

雖然這沒有奏效......值得努力。感謝您的輸入。 –

+0

它絕對爲我工作。也許在你的應用程序中,一些小部件沒有正確地連接到DOM。嘗試在簡單的RootPanel上運行這個例子。 – fascynacja