Java 使用简单对象时阻止web应用程序。等待

Java 使用简单对象时阻止web应用程序。等待,java,multithreading,vaadin,Java,Multithreading,Vaadin,我正在窗口上使用锁定对象,我要阻止: 当用户单击“单击我”按钮时,我想打开一个包含日历的窗口,并且用户应该在日历中选择一个日期。用户在选择日期之前应该被阻止,所以我写了以下内容: Button button = new Button("Click Me"); button.addClickListener(new Button.ClickListener() { public void buttonClick(ClickEvent event) { synchro

我正在窗口上使用锁定对象,我要阻止: 当用户单击“单击我”按钮时,我想打开一个包含日历的窗口,并且用户应该在日历中选择一个日期。用户在选择日期之前应该被阻止,所以我写了以下内容:

    Button button = new Button("Click Me");
    button.addClickListener(new Button.ClickListener() {
        public void buttonClick(ClickEvent event) {
synchronized (Lock.getInstance()) {
          DateChooser dateChooser = new DateChooser(new com.kopiright.xkopi.lib.type.Date(2013, 12, 9));



          UI.getCurrent().addWindow(dateChooser);


              System.out.println("!!!!!!!!!!!I'm waiting ...");
            try {
              Lock.getInstance().wait();
              System.out.println("I'm waiting ...");
            } catch (InterruptedException e) {
              e.printStackTrace();
            }

         }

        }

      });
当用户单击按钮时,窗口不会显示,页面会无限等待。 问题是我阻塞了装入应用程序的principle类。 那么如何预防呢。 我应该创建一个单独的线程来显示DateChooser窗口吗

这是通知电话: 在DateChooser类中,我写了以下内容:

@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();
  }
 }
这是锁类

public class Lock
 {
  private static Lock lockInstance;

public static  Lock getInstance()
{
 if (lockInstance == null)
   {lockInstance = new Lock();
    System.out.println("Creating a lock instance ...");}
    return lockInstance;
  }

 }

您误解了两个
wait
概念:GUI块和同步


在您的情况下,您不需要同步任何内容,您只需找到一种方法,在用户单击按钮时禁用打开器GUI窗口,并显示新窗口。

您误解了两个
等待
概念:GUI块和同步


在您的情况下,您不需要同步任何内容,只需找到一种方法,在用户单击按钮时禁用打开器GUI窗口,并显示新窗口。

在vaadin中,http请求-响应的相同web原则也适用。当用户单击按钮时,会发出请求,为了显示窗口,服务器的响应必须完成。但当线程被阻塞时,这种情况不会发生

此外,为了实现您所描述的,您不需要线程控制。只需在模式窗口上显示日历,从窗口中删除关闭控件,并仅使用dateChooser对象的值change listener关闭窗口


假设DateChooser是一个vaadin窗口,您可以调用
setModal(true)使其成为模态。也可以看看瓦丁的书
https://vaadin.com/book/vaadin7/-/page/layout.sub-window.html

在vaadin中,http请求-响应的相同web原则也适用。当用户单击按钮时,会发出请求,为了显示窗口,服务器的响应必须完成。但当线程被阻塞时,这种情况不会发生

此外,为了实现您所描述的,您不需要线程控制。只需在模式窗口上显示日历,从窗口中删除关闭控件,并仅使用dateChooser对象的值change listener关闭窗口


假设DateChooser是一个vaadin窗口,您可以调用
setModal(true)使其成为模态。也可以看看瓦丁的书
https://vaadin.com/book/vaadin7/-/page/layout.sub-window.html

在用户选择日期之前,我搜索了很多关于如何禁用当前页面的内容,但没有找到有用的内容。谢谢:)我认为您可以简单地执行
window.setVisible(false)
,但我不是swing专家,肯定有更好的方法;)在用户选择日期之前,我搜索了很多关于如何禁用当前页面的内容,但没有找到有用的内容。谢谢:)我认为您可以简单地执行
window.setVisible(false)
,但我不是swing专家,肯定有更好的方法;)