2013-12-09 2 views
1

Я новичок в Vaadin, и я хочу реализовать это: при нажатии кнопки открывается окно с календарем, и пользователь должен выбрать дату в календаре. Пользователь должен быть заблокирован, пока он не выбирает дату, так что я написал это:Блокировка текущей нити до закрытия диалогового окна: веб-приложение

public class KopivaadincomponentsUI extends UI { 

@Override 
protected void init(VaadinRequest request) { 
    final VerticalLayout layout = new VerticalLayout(); 
    layout.setMargin(true); 
    setContent(layout); 


    Button button = new Button("Click Me"); 
    button.addClickListener(new Button.ClickListener() { 
     public void buttonClick(ClickEvent event) { 

      DateChooser dateChooser = new DateChooser(new com.kopiright.xkopi.lib.type.Date(2013, 12, 9)); 
      UI.getCurrent().addWindow(dateChooser); 

      synchronized (Lock.getInstance()) { 
       while (dateChooser.isVisible()) { 
      try { 
       Lock.getInstance().wait(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
       } 
     } 

     } 
     }); 
    layout.addComponent(button); 
} 

Вот DateChooser — окно, содержащее календарь:

public class DateChooser extends Window implements ValueChangeListener{ 


public DateChooser(Date date){ 
    this.setModal(true); 
    final FormLayout content = new FormLayout(); 
    calPane = new CalendarPane(); 
    content.addComponent(calPane); 
    this.setContent(content); 
    lock =new Lock(); 

} 


/*package*/ class CalendarPane extends InlineDateField { 

public CalendarPane() { 
    setImmediate(true); 
    setResolution(RESOLUTION_DAY); 
    setShowISOWeekNumbers(true); 
    } 

    private static final long serialVersionUID = -3958329773743250969L; 
} 

private CalendarPane  calPane; 
private static final long serialVersionUID = 1L; 

@Override 
public void valueChange(ValueChangeEvent event) { 
    synchronized(Lock.getInstance()) { 
    String date = String.valueOf(event.getProperty().getValue()); 
    Calendar cal = Calendar.getInstance(Locale.FRANCE); 
    cal.setTime((java.util.Date) event.getProperty().getValue()); 

    setSelectedDate(new NotNullDate(cal)); 
    this.close(); 
    Lock.getInstance().notify(); 

    } 

    } 

} 

Проблема заключается в том, что при нажатии на кнопку она бесконечно ждет. Любые идеи будут оценены.

ответ

1

Не изобретайте велосипед. То, что вы хотите, - это модальный диалог. Есть вопрос о них here, который содержит ссылки на всю необходимую информацию.

+2

Swing? Ick ..... –

+1

Модальное в vaadin предотвращает взаимодействие с другими формами, оно не останавливает поток от выполнения дальнейших инструкций. – SureshS

+0

@SureshS Это правда. ОП не спрашивал, как остановить поток от выполнения - они спросили, как заблокировать пользователя от других действий, кроме выбора даты. –

0

Фактически у Swing есть блокирующие диалоги. Метод show() фактически блокируется до тех пор, пока пользователь не нажмет кнопку, и диалоговое окно не получит результат. Это делается с помощью show(), выполняющего свой собственный вложенный контур диспетчера событий, как описано здесь: How can Swing dialogs even work?

К сожалению, это невозможно с Vaadin. Тем не менее, есть умная техника под названием Coroutines, которая позволяет использовать диалоги Vaadin, как если бы они блокировались: http://mavi.logdown.com/posts/3488105-vaadin-kotlin-coroutines

Смежные вопросы