2015-10-20 2 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"); 

Но, очевидно, затмение подчеркивает метод удалить, давая мне ошибку:

The local variable butYes may not have been initialized

Итак, есть ли какие-либо идеи о том, как это сделать? Или есть какой-нибудь способ?

Я также думал о создании счетчика, но это тоже не работает.

Извините, если это глупый вопрос, но я совершенно новичок в GWT.

P.S. Искал сайт по аналогичному вопросу, нашел только отключение, но это НЕ то, что мне нужно.

+0

hp1 является HorizontalPanel? –

+0

Попробуйте создать кнопку сначала, чтобы инициализировать ее, а затем добавить обработчик кликов (два отдельных оператора). Это должно предотвратить ошибку Eclipse, так как теперь YES будут инициализированы. – 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 перед объявлением кнопок, так как была ошибка, которая должна быть переменной final) –

+0

Объявили вашу кнопку вне метода? –

+0

Нет, это внутри метода 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.

1

Кнопка будет источником ClickEvent, так:

@Override 
public void onClick(ClickEvent event) { 
    // … 
    hp1.remove((Widget) event.getSource()); 
} 
Смежные вопросы