SWT DateTime中没有默认日期

5

我正在使用SWT DateTime组件。当实例化时,它会将当前日期设置为默认选择。如何防止这种情况发生?

我希望根本没有日期被选择...

谢谢 Patrick

4个回答

4

3
如果这对任何人仍然有用 - 我遇到了同样的问题,这意味着UI上的一个字段必须显示一个日期或一个空值:因为未选择的日期也是有效输入。 虽然SWT DateTime必须显示某种日期,但通过简单地制作一个标签和一个按钮来引入另一层间接性根本不是问题:该按钮在单独的模态窗口中调用DateTime。 用户进行选择后,我们将结果写回应用程序窗口中的标签。 您还可以在模态窗口中添加另一个按钮,并将其称为NONE。 如果用户单击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();
            }
        }

        ...

    }
    });

1

您需要手动将实例的字段设置为0或null,具体取决于情况。您还可以使用空对象模式实现自己的NoDateTime对象来完成相同的操作。不过,我倾向于使用null来表示没有时间,是否有任何原因您不能这样做呢?


0

一种方法是设置选择监听器,就像在Eclipse-DOC中的示例一样。

这里是一个适应版本:

private boolean isModified = false;

selectDate = new DateTime(this, SWT.DATE | SWT.DROP_DOWN);

    SelectionListener selListener = new SelectionAdapter() {
        @Override
        public void widgetSelected(SelectionEvent e) {
            isModified = true;
        }
    };

    selectDate.addSelectionListener(selListener);

然后您可以在需要的地方使用 If isModified。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接