2013-06-18 52 views
1


我有一個在com.smartgwt.client.widgets.Window.Window()中打開的搜索表單。在這裏面,我有一個VLayout,其中我有一個搜索表單:SmartGWT TextItem - focusInItem()方法不工作?

DynamicForm search = new DynamicForm(); 
// setMargin, setTitle, setNumCols 
TextItem name = new TextItem(); 
name.setFormatOnFocusChange(true); 
//setEditorValueFormatter, etc. 
search.setFields(/*some fields*/, name, /*other fields*/); 
name.focusInItem(); 

和重點是不是在項目(這是無處)。爲什麼?
預先感謝您!
編輯:
這裏是兩個調解員代碼:

public class MainMediator extends Mediator { 
private Window popup = new Window(); 

protected void initView(){ 
     // here I have a Form with fields and icon on one TextItem, on which I do: 
    searchField.addIconClickHandler(new IconClickHandler() { 
    popup = new Window(); 
    popup.setIsModal(true); 
    popup.setShowModalMask(true); 
    }); 
} 

public final void handleNotification(final INotification notification){ 
    // if the right notification is sent, execute this code: 
    PopupMediator m = (PopupMediator) this.getFacade().retreiveMediator(PopupMediator.NAME); 
     VLayout popupLayout = (VLayout) m.getViewComponent(); 
    popup.addItem(popupLayout); 
     popup.show(); 
    } 
} 

public class PopupMediator extends Mediator { 
    protected void initView(){ 
    viewComponent = new VLayout(); 
    DynamicForm searchForm = new DynamicForm(); 
    // searchForm props 
    TextItem name = new TextItem(); 
    // name props and some other fields 
    searchForm.setFields(name /* and the others */); 
     VLayout searchFormContainer = new VLayout(); 
    // searchFormContainer props 
     searchFormContainer.setMembers(seachForm); 
     name.focusInItem(); // not working on popup shown 
    HLayout searchContainer = new HLayout(); 
    // searchContainer props 
    searchContainer.setMembers(grid1, searchFormContainer); 
    VLayout container = new VLayout(); 
    // container props 
     container.setMembers (searchContainer, grid2); 
     ((VLayout)viewComponent).setMembers(container, buttons); 
} 

回答

0

你爲什麼不把注意力表單本身:

search.focus(); 
+0

它不工作:( – Bubolina

4

你得到這個問題,因爲formitem.focusInItem()只有在formitem繪製或在瀏覽器中呈現後纔有效。在DynamicForm中添加formitem不會繪製它。

我不知道你在哪裏放置DynamicForm,但完全理解它,看看下面的代碼:

Window window = new Window(); 
window.setSize("900px", "500px"); 
VLayout layout = new VLayout(); 
DynamicForm dynamicForm = new DynamicForm(); 
dynamicForm.setSize("800px", "400px"); 
TextItem item = new TextItem(); 
dynamicForm.setFields(item); 
item.focusInItem(); // This won't work. 
layout.addMember(dynamicForm); 
window.addItem(layout); 
item.focusInItem(); // This won't work. 
window.show(); 
item.focusInItem(); // This will work. 

所以相應地改變你的代碼。

+0

它不工作。也許問題是我使用com.smartgwt.client.widgets.Window.Window()而不是com.google.gwt.user.client.Window.Window()?或者是因爲我的應用程序的架構使用SmartGWT的和puremvc在一起? 我有中保「SearchM」和中保「彈出」我創造「SearchM」窗口對象,但我在一個通知,稱「彈出式」調解員視圖組件,我在其中還調用show()方法我試過幾件事情: 1)顯示窗口,然後調用focusInItem() 2)繪製窗口,調用focusInItem(),然後調用show() 3)在onDraw有添加focusInItem()事件「彈出」 這些都不奏效。 – Bubolina

+0

那麼在這種情況下,我需要看看你的代碼。 – RAS

+0

我加了兩個介質的代碼在我的問題上面。由於禁止複製粘貼,我手寫了代碼的主要部分,但請告訴我您是否需要更多內容。非常感謝! – Bubolina

1

不知道如何接收handleNotification()回調,但不應該在其中使用window.addItem()。
這會導致每次調用回調時都會添加/覆蓋多個項目。

如果需要handleNotification()回調函數,它應該只用於window.show(),加上任何形式字段填充/設置焦點/等。

如果窗口的內容是不會從一個回調改變到另一個,窗口創建過程中,初始化窗口布局。
如果Window的內容正在從一個回調更改爲另一個回調,則需要刪除以前添加的項目。

下面是一個簡單的工作實現,該按鈕在按鈕單擊時彈出窗口並將焦點設置給定字段。

TextItem name1 = new TextItem("name1", "Name 1"); 
final TextItem name2 = new TextItem("name2", "Name 2"); // setting focus to name2 
TextItem name3 = new TextItem("name3", "Name 3"); 

final DynamicForm searchForm = new DynamicForm(); 
// searchForm.setAutoFocus(true); // sets focus to first focusable field 
searchForm.setFields(name1, name2, name3); 

VLayout searchFormContainer = new VLayout(); 
searchFormContainer.setMembers(searchForm); 

final Window window = new Window(); 
window.setIsModal(true); 
window.setShowModalMask(true); 
window.setAutoCenter(true); 
window.setSize("400px", "300px"); 
window.addItem(searchFormContainer); 

Button button = new Button("Search"); 
button.addClickHandler(new ClickHandler() { 
    public void onClick(ClickEvent event) { 
     window.show(); 
     name2.focusInItem(); 
     // searchForm.focusInItem(name2); // this also works 
    } 
}); 

及其可能使用DynamicForm.setAutoFocus自動聚焦第一可聚焦場的形式。