2015-10-20 123 views
0

有一個問題 - 我想在點擊它之後從面板中刪除GWT中的按鈕。GWT刪除按鈕後點擊它

事情是這樣的:

VerticalPanel vp3 = new VerticalPanel(); 
    vp3.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); 

    final HorizontalPanel hp1 = new HorizontalPanel(); 
    hp1.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); 

    final HTML fireCondText = new HTML("Fire conditions"); 
    fireCondText.setStyleName("h1"); 

    final HTML obscurity = new HTML("Obscurity:"); 
    obscurity.setStyleName("h3"); 

    final HTML statusObscurity = new HTML("NO"); 
    statusObscurity.setStyleName("no"); 
    if (statusObscurity.getHTML() == "YES") statusObscurity.setStyleName("yes"); 

    Button butObscurity = new Button(
      "Edit", new ClickHandler() { 
       public void onClick(ClickEvent event) { 
        final Button butYes = new Button(
          "YES", new ClickHandler() { 
           public void onClick(ClickEvent event) { 
            statusObscurity.setHTML("YES"); 
            hp1.remove(butYes); 
           } 
          }); 
        final Button butNo = new Button(
          "YES", new ClickHandler() { 
           public void onClick(ClickEvent event) { 
            statusObscurity.setHTML("NO"); 
            hp1.remove(butNo); 
           } 
          }); 
        hp1.add(butYes); 
        hp1.add(butNo);      
       } 
      } 
      ); 
    butObscurity.setStyleName("editButton"); 

但是,很明顯,日食強調remove方法,給我的錯誤:

The local variable butYes may not have been initialized

那麼,有沒有人對如何做到這一點的任何想法?或者有什麼辦法嗎?

我也想過創建計數器,但這也不起作用。

對不起,如果這是一個愚蠢的問題,但我在GWT中很新手。

P.S.搜索該網站的類似問題,只發現禁用,但這不是我所需要的。

+0

HP1是Horizo​​ntalPanel? –

+0

嘗試先創建按鈕以初始化它,然後添加單擊處理程序(兩個單獨的語句)。這應該可以防止Eclipse錯誤,因爲但是現在將被初始化。 – MikeJ

+0

@ShiladittyaChakraborty,是的。 –

回答

0

全局聲明的按鈕:

Button butYes = null; 
Button butNo = null; 

然後修改您的方法:

  Button butObscurity = new Button(
         "Edit", new ClickHandler() { 
          public void onClick(ClickEvent event) { 
           butYes = new Button(
             "YES", new ClickHandler() { 
              public void onClick(ClickEvent event) { 
               statusObscurity.setHTML("YES"); 
               hp1.remove(butYes); 
              } 
             }); 
           butNo = new Button(
             "YES", new ClickHandler() { 
              public void onClick(ClickEvent event) { 
               statusObscurity.setHTML("NO"); 
               hp1.remove(butNo); 
              } 
             }); 
           hp1.add(butYes); 
           hp1.add(butNo);      
          } 
         } 
         ); 
+0

現在我得到錯誤 最終的局部變量butYes不能分配,因爲它是在封閉類型中定義的,但舊的錯誤不再顯示(我在聲明按鈕之前添加了final,因爲變量必須是錯誤的最後) –

+0

在方法之外聲明你的按鈕? –

+0

nope,它的內部方法fireCond,因爲我需要在這裏,因爲我想盡量減少onModuleLoad方法中的代碼 –

1

您正試圖訪問一個可能尚未初始化的變量。 因此第一創建的按鈕(多個),然後再連接ClickListener(多個):

final Button butYes = new Button("YES"); 
butYes.addClickHandler(new ClickHandler() { 
    public void onClick(ClickEvent event) { 
     statusObscurity.setHTML("YES"); 
     hp1.remove(butYes); 
    } 
}); 
+0

這段代碼不起作用,因爲clickHandler在另一個按鈕的clickHandler中,但仍然是thx! –

+0

@GeorgeSalukvadze爲什麼不起作用?你會得到一個編譯器或運行時錯誤? – wero

0
public void onClick(ClickEvent event) { 
    statusObscurity.setHTML("YES"); 
    hp1.remove(butYes); 
} 

單擊按鈕時,程序執行代碼 - hp1.remove(butYes)。程序不確定變量是否有值,因此IDE會顯示警告 - 局部變量可能未被初始化。

如果你只是解決警告,只是初始化變量。

的最佳方式:

public void onClick(ClickEvent event) { 
    statusObscurity.setHTML("YES"); 
    if (butYes != null) { 
     hp1.remove(butYes); 
    } 
} 

,如果它是複雜的sofeware,你檢查是否butYes爲空。也許你將butYes設置爲null。

1

該按鈕將是ClickEvent的源極,所以:

@Override 
public void onClick(ClickEvent event) { 
    // … 
    hp1.remove((Widget) event.getSource()); 
}