阻止当前线程直到对话框关闭:Web应用程序

时间:2013-12-09 16:58:58

标签: java multithreading vaadin

我是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();

   }

  }

 }

问题是,当我点击按钮时,它会无限期地等待。 任何想法将不胜感激。

2 个答案:

答案 0 :(得分:1)

不要重新发明轮子。你想要的是一个模态对话框。关于他们的问题here可以链接到您需要的所有信息。

答案 1 :(得分:0)

实际上Swing有阻塞对话框。事实上,show()方法会阻塞,直到用户单击按钮并且对话框获得结果。这是通过show()运行它自己的嵌套事件调度程序循环完成的,如下所述:How can Swing dialogs even work?

不幸的是,Vaadin无法做到这一点。但是,有一种名为Coroutines的聪明技术允许您使用Vaadin对话框,就像它们阻塞一样:http://mavi.logdown.com/posts/3488105-vaadin-kotlin-coroutines