2010-01-12 5 views
3

Я использую компонент SWT DateTime. Он устанавливает текущую дату как выбор по умолчанию, если он был установлен. Как я могу предотвратить это?Нет По умолчанию Дата в SWT DateTime

Я хочу, чтобы дата не выбрана вообще ...

Благодаря Patrick

ответ

1

Вам придется вручную установить поле экземпляра 0 или нуль независимо является подходящим. Вы также можете реализовать свой собственный объект NoDateTime (используя шаблон нулевого объекта), чтобы выполнить одно и то же. У меня возникло бы желание не представлять времени с нулевым, но есть ли причина, почему вы не можете этого сделать?

3

Если это по-прежнему полезно для всех - у меня была такая же проблема, что и поле в пользовательском интерфейсе должно было указывать дату или пустое значение: поскольку дата, которая была выбрана НЕ, также была допустимой. В то время как SWT DateTime должен показывать какую-то дату, это совсем не проблема, представляющая другой уровень косвенности, просто делая ярлык и кнопку - тоже выглядят как DateTime: тогда кнопка вызывает 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(); 
      } 
     } 

     ... 

    } 
    }); 
Смежные вопросы