2010-01-12 54 views
3

我正在使用SWT DateTime組件。它立即將當前日期設置爲默認選擇。我怎樣才能防止這個?SWT中沒有默認日期DateTime

我想,沒有日期被選定在所有...

感謝 帕特里克

回答

1

你將不得不手動設置實例的字段爲0或空什麼是適當的。你也可以實現你自己的NoDateTime對象(使用null對象模式)來完成同樣的事情。雖然我會試圖表示沒有時間,但是有沒有理由不能這樣做?

3

如果這仍然對任何人都有用 - 我遇到同樣的問題,這意味着UI上的字段必須顯示日期或空值:因爲沒有選擇的日期也是有效的輸入。 雖然SWT DateTime必須顯示某種日期,但通過簡單地製作標籤和按鈕來引入另一級別的間接方式並不是問題 - 它看起來像DateTime:Then按鈕在單獨的模式窗口中調用DateTime。在用戶做出選擇之後,我們將結果寫回到應用程序窗口中的標籤。您還可以在模態窗口中添加另一個按鈕並將其稱爲沒有。如果用戶單擊NONE,則清除應用程序中的標籤字段。 您將看到我首先從標籤中刪除當前日期值,以便可以在模式對話框中初始化DateTime控件。這樣它就像一個新的複合控件一樣,儘管我承認如果你需要多次複製它會有點尷尬。例如:

private Button buttonDeadlineDate; 
private Label labelDeadlineDate; 

// ... then define your "composite" control: 

lblNewLabel_5 = new Label(group_2, SWT.NONE); 
lblNewLabel_5.setBounds(10, 14, 50, 17); 
lblNewLabel_5.setText("Deadline:"); 

// We make our own composite date control out of a label and a button 
// and we call a modal dialog box with the SWT DateTime and 
// some buttons. 
labelDeadlineDate = new Label(group_2, SWT.BORDER | SWT.CENTER); 
labelDeadlineDate.setBounds(62, 10, 76, 20); 
// Note that I use the strange font DokChampa because this was the only way to get a margin at the top. 
labelDeadlineDate.setFont(SWTResourceManager.getFont("DokChampa", 8, SWT.NORMAL)); 
labelDeadlineDate.setBackground(SWTResourceManager.getColor(255, 255, 255)); // so it does appear editable 
buttonDeadlineDate = new Button (group_2, SWT.NONE); 
buttonDeadlineDate.setBounds(136, 11, 20, 20); // x - add 74, y - add 1 with respect to label 


// ... And later we have the call-back from the listener on the little button above: 

    //======================================== 
    // Deadline Date 
    //======================================== 

    buttonDeadlineDate.addSelectionListener(new SelectionAdapter() { 
    @Override 
    public void widgetSelected(SelectionEvent e) { 

     // Define the dialog shell. 
     // Note: DIALOG_TRIM = TITLE | CLOSE | BORDER (a typical application dialog shell) 
     final Shell dialog = new Shell (shlTaskScheduler, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL); 
       dialog.setText("Enter deadline date (NONE for none)"); 

     //======================================== 
     // Position and size the dialog (relative to the application). 
     // could have probably also used a single call to dialog.setBounds() 
     // instead of calling setLocation() and setSize(). 
     //======================================== 
     Point myPoint = new Point(0,0); 
     myPoint = shlTaskScheduler.getLocation(); 
     myPoint.x +=80; // myPoint.x +=30; 
     myPoint.y +=320; // myPoint.y +=350; 
     dialog.setLocation(myPoint); 
     dialog.setSize(270, 220); 

     dialog.setLayout (null); 

     //======================================== 
     // Define dialog contents 
     //======================================== 

     // Make controls final they it can be accessed from the listener. 

     final DateTime DTDeadlineDate; 
     DTDeadlineDate = new DateTime(dialog, SWT.BORDER | SWT.CALENDAR | SWT.DROP_DOWN); 
     DTDeadlineDate.setBounds(10, 10, 175, 175); 

     final Button buttonNone = new Button (dialog, SWT.PUSH); 
     buttonNone.setText ("NONE"); 
     buttonNone.setBounds(200, 35, 55, 25); 

     final Button buttonOK = new Button (dialog, SWT.PUSH); 
     buttonOK.setText ("OK"); 
     buttonOK.setBounds(200, 85, 55, 25); 

     //======================================== 
     // Initialize the DateTime control to 
     // the date displayed on the button or today's date. 
     //======================================== 

     // Get the deadline from the main application window 
     String newDeadlineDateString = (labelDeadlineDate.getText().toString()); 
     myLogger.i (className, "got deadline from main application window as " + newDeadlineDateString); 

     // If deadline date found, use it to initialize the DateTime control 
     // else the DateTime control will initialize itself to the current date automatically. 
     if ((newDeadlineDateString.length() == 10) // probably unnecessary test 
     && (isThisDateValid(newDeadlineDateString, "yyyy-MM-dd"))) { 

      // parse and extract components 
      try { 
       String tmpYearString= newDeadlineDateString.substring(0,4); 
       String tmpMoString = newDeadlineDateString.substring(5,7); 
       String tmpDayString = newDeadlineDateString.substring(8,10); 

       int tmpYearInt = Integer.parseInt(tmpYearString); 
       int tmpMoInt = Integer.parseInt(tmpMoString); 
       int tmpDayInt = Integer.parseInt(tmpDayString); 

       DTDeadlineDate.setYear(tmpYearInt); 
       DTDeadlineDate.setMonth(tmpMoInt - 1); // the control counts the months beginning with 0! - like the calendar 
       DTDeadlineDate.setDay(tmpDayInt); 

      } catch(NumberFormatException f) { 
       // this should not happen because we have a legal date 
       myScreenMessage.e(className, "Error extracting deadline date from screen <" + newDeadlineDateString + ">. Ignoring"); 
      } 
     } else if (newDeadlineDateString.length() > 0) { 
      myLogger.w (className, "Illegal current deadline date value or format <" + newDeadlineDateString + ">. Ignoring."); 
      // no need to do anything, as the control will initialize itself to the current date 
     } else { 
      // no need to do anything, as the control will initialize itself to the current date 
     } 

     //======================================== 
     // Set up the listener and assign it to the OK and None buttons. 
     // Note that the dialog has not been opened yet, but this seems OK. 
     // 
     // Note that we define a generic listener and then associate it with a control. 
     // Thus we need to check in the listener, which control we happen to be in. 
     // This is a valid way of doing it, as an alternative to using 
     //  addListener() or 
     //  addSelectionListener() 
     // for specific controls. 
     //======================================== 

     Listener listener = new Listener() { 
      public void handleEvent (Event event) { 

       if (event.widget == buttonOK) { 

        int newDeadlineDay = DTDeadlineDate.getDay(); 
        int newDeadlineMonth = DTDeadlineDate.getMonth() + 1; // the returned month will start at 0 
        int newDeadlineYear = DTDeadlineDate.getYear(); 

        String selectedDeadlineDate = String.format ("%04d-%02d-%02d", newDeadlineYear, newDeadlineMonth, newDeadlineDay); 
        if (isThisDateValid(selectedDeadlineDate, "yyyy-MM-dd")) { 
         labelDeadlineDate.setText(selectedDeadlineDate); 
        } else { 
         // This is strange as the widget should only return valid dates... 
         myScreenMessage.e(className, "Illegal deadline date selected: resetting to empty date"); 
         labelDeadlineDate.setText(""); 
        } 

       } else if (event.widget == buttonNone) { 
        // an empty date is also an important value 
        labelDeadlineDate.setText(""); 
       } else { 
        // this should not happen as there are no other buttons on the dialog 
        myLogger.e(className, "Unexpected widget state: ignoring"); 
       } 

       // once a button is pressed, we close the dialog  
       dialog.close(); 
      } 
     }; 

     // Still need to assign the listener to the buttons   
     buttonOK.addListener (SWT.Selection, listener); 
     buttonNone.addListener (SWT.Selection, listener); 

     //======================================== 
     // Display the date dialog. 
     //======================================== 
     dialog.open(); 

     //======================================== 
     // If you need to do this - you can wait for user selection before returning from this listener. 
     // Note that this wait is not necessary so that the above button listeners 
     // can capture events, but rather so that we do not continue execution and end this 
     // function call before the user has made a date selection clicked on a button. 
     // Otherwise we would just go on. 

     while (!dialog.isDisposed()) { 
      if (!display.readAndDispatch()) { 
       display.sleep(); 
      } 
     } 

     ... 

    } 
    });