2013-06-28 56 views
1

我在窗口內有幾個TextField,並且有一個按鈕,例如,一個按鈕。 TextField的,按鈕和窗口都有setImmediate(True)。Vaadin:強制按鈕被視覺禁用

當TextField失去焦點時,會執行一些驗證代碼,如果失敗,則調用: aButton.setEnabled(False);

當不正確的數據輸入到一個TextField中,然後焦點丟失時,調試器顯示aButton.setEnabled(False)被調用,但aButton仍然看起來處於啓用狀態。

兩個可能的事情可以發生在這裏:

1)如果一個人在另一個文本字段修改數據並退出該領域(失去焦點),驗證可以成功與否的那場,但系統將知道由於前面的TextField仍然無效,因此請調用aButton.setEnabled(False)。這次雖然aButton視覺被禁用。

2.)如果一個點擊A按鈕可目視啓用它產生此警告然後目視變爲禁用: 警告:忽略供殘疾人使用的組分<類「ui.button.Button」>,字幕變量變化= OK

目前使用Vaadin 6.7.3

是否有任何已知的解決方法來強制aButton在手動設置爲禁用後立即在視覺上變爲禁用狀態(強制客戶端更新)?

回答

1

button.setVisible(false)將始終工作。您需要小心不要觸發焦點丟失事件中的另一個事件,最終將按鈕的可見性設置爲true。

您可以請求重新繪製一個組件或整個窗口,但整個框架的重點是您永遠不需要這樣做,因爲視覺修改的組件會自動重新繪製每個請求。

只是爲了好奇,你是否讓你的請求在嘗試查看瀏覽器更新之前完成?或者,在調試器中傳遞setVisible()行之後,您會立即查看瀏覽器?

我認爲你的第二點發生是因爲你點擊了按鈕,按順序發生的事情是:第一次你的焦點丟失事件運行(可能會禁用你的按鈕),第二次按鈕點擊運行,不知何故重畫請求該按鈕,因爲按鈕中發生了狀態更改,但重新繪製會顯示警告,因爲它被禁用(僅由焦點丟失事件禁用),所以警告它不會執行任何操作。

作爲便箋。我認爲這個用戶界面不會帶來好的用戶體驗,它應該是其他方式,如果驗證是好的,然後顯示按鈕(或者更好,總是顯示按鈕,但啓用/禁用取而代之),但它取決於...

1

不幸的是,我現在只有Vaadin 7在我的處置,但我無論如何檢查了這一點。它的工作原理與你想要的一樣,並且我必須得出結論,Vaadin 6.7.3中的這一點應該是一樣的。這部分在Vaadin7中並沒有真正的不同......你是否在一個孤立的代碼(只有一個文本框和按鈕)中試過這個功能?

VerticalLayout vlTestContent = new VerticalLayout(); 
final Button butChangeMe = new Button("Enabled"); 
final TextField tf = new TextField("Blur", "default value"); 
tf.addBlurListener(new BlurListener() { 
    private static final long serialVersionUID = 5544993392287938660L; 
    @Override 
    public void blur(BlurEvent event) { 
     butChangeMe.setCaption("Disabled"); 
     butChangeMe.setEnabled(false); 
    } 
}); 
Button but = new Button("Change button", new ClickListener() { 
    private static final long serialVersionUID = -2235317499126190105L; 
    @Override 
    public void buttonClick(ClickEvent event) { 
     butChangeMe.setCaption("Enabled"); 
     butChangeMe.setEnabled(true); 
    } 
}); 
vlTestContent.addComponent(butChangeMe); 
vlTestContent.addComponent(tf); 
vlTestContent.addComponent(but); 

(第二個按鈕是隻是爲了好玩)