2013-12-10 32 views
1

我在窗口上使用鎖定對象時,我想阻止: 當用戶單擊按鈕「單擊我」時,我想打開包含日曆的窗口被打開,並且用戶應該在日曆中選擇一個日期。用戶應該被阻止,直到他選擇的日期,所以我寫了這個:使用簡單對象時阻止Web應用程序。等待

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(); 
      } 

     } 

     } 

     }); 

當用戶點擊按鈕,窗口不顯示和網頁等待無限。 問題是,我阻止了應用程序啓動的原則類。 那麼如何防止這一點。 我應該創建一個顯示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; 
    } 

} 

回答

2

你弄錯2個wait概念:GUI塊,並同步。

在你的情況下,你不需要同步任何東西,你只需要找到一種方式來禁用當用戶點擊按鈕並顯示新的開啓者GUI窗口。

+0

我搜索了很多關於如何禁用當前頁面,直到用戶選擇一個日期,但我沒有找到有用的東西。謝謝:) – AmiraGL

+0

我覺得你可以簡單地做'window.setVisible(false)',但我不是鞦韆專家,有更好的方法可以肯定;) –

2

在vaadin中,http請求響應的相同網絡原則適用。當用戶單擊該按鈕時,會發出請求,爲了顯示窗口,必須完成服務器的響應。但是,這不會發生,因爲線程被阻止。

此外,要實現您所描述的內容,您不需要線程控制。只需在模式窗口中顯示日曆,從窗口中移除關閉控件,並僅使用dateChooser對象的值更改偵聽器關閉窗口。

假設DateChooser是一個vaadin窗口,你可以調用setModal(true);來使它成爲模態。還可以看一下vaadin https://vaadin.com/book/vaadin7/-/page/layout.sub-window.html的書。