2012-09-03 30 views
5

在一個按鈕的actionListener中,我們希望快速創建一個表單。CodeNameOne動態創建表單,如何「返回」

如喜歡的東西

Button b = new Button("Clickme"); 
b.setActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     Form f = new Form(); 
     Container c = new Container(); 
     ... 
     f.addComponent(c); 
     f.show(); 
    } 
}); 

工作正常.....但「後退」按鈕將無法正常工作

有誰知道一個ActionListener實現動態表單的正確方法,或通過動作偵聽器跳轉到預定義的表單?

感謝

詹姆斯

回答

3

你需要創建一個回命令,並將其與表單關聯:

Command back = new Command("Back") { 
    public void actionPerformed(ActionEvent ev) { 
     // notice that when showing a previous form it is best to use showBack() so the 
     // transition runs in reverse 
     showPreviousForm(); 
    } 
}; 
f.setBackCommand(back); 

您可以在廚房水槽演示這完全是手工編碼的看到這一點。

+1

嗨,謝謝你的回覆。沒有多少運氣。我有一個表格列表。每個列表項都有一個按鈕,該按鈕有一個actionListener,可以隨時生成一個表單。我可以鑽回到listrenderer類,但是在那個時候調用getComponentForm()會得到一個NPE .....所以不知道如何讓parentForm設置parentForm.showBack()。 – jamesarbrown

+1

您需要再次生成以前的表單,這正是我們在GUI構建器中所做的。或者,您可以將表單實例保留在RAM中,這會帶來明顯的內存開銷。 –

+0

好的,沒有意識到當生成新的表單時,舊的表單對象從內存中釋放。將有一個思考如何循環重組。 – jamesarbrown

0

你也可以給形式參數

chooseDB(c.getComponentForm()); 

private void chooseDB(final Form main) { 
    Form f = new Form("Choose a Database"); 
    ... 
    Command backCommand = new Command("Back") { 
     public void actionPerformed(ActionEvent ev) { 
      main.showBack(); 
     }}; 
    f.addCommand(backCommand); 
    f.setBackCommand(backCommand); 
    f.show(); 
} 

因此,對於你的例子:

Button b = new Button("Clickme"); 
b.setActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent evt) { 
     Form f = new Form(); 
     Container c = new Container(); 
     Command backCommand = new Command("Settings") { 
     public void actionPerformed(ActionEvent ev) { 
      b.getComponentForm().showBack(); 
     }}; 
    f.addCommand(backCommand); 
    f.setBackCommand(backCommand); 
     f.addComponent(c); 
     f.show(); 
    } 
}); 

曬版機,請解決這個問題,如果我沒有做錯任何事。謝謝。