Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java GWT DatePickerCell显示“空”日期?_Java_Gwt_Datepicker - Fatal编程技术网

Java GWT DatePickerCell显示“空”日期?

Java GWT DatePickerCell显示“空”日期?,java,gwt,datepicker,Java,Gwt,Datepicker,我使用的单元格表也带有DatePickerCell,我希望能够显示未设置的日期,例如空日期。但在实现getValue方法时,我必须返回一些信息: Column<EventProxy, Date> startTimeColumn = new Column<EventProxy, Date>( new DatePickerCell()) { @Override public

我使用的单元格表也带有DatePickerCell,我希望能够显示未设置的日期,例如空日期。但在实现getValue方法时,我必须返回一些信息:

        Column<EventProxy, Date> startTimeColumn = new Column<EventProxy, Date>(
            new DatePickerCell()) {
                @Override
                public Date getValue(EventProxy object) {
                    Date ret = object.getStartTime();
                    return ret != null ? ret : new Date();
                }
    };

如果object.getStartTime为null,则表示未设置它,我希望将其显示为null。或标签为空或文本为空。正如我所说,getValue方法必须返回一些东西。如果我返回null,我以后会得到异常,如果我返回具体的日期,它会显示为有效日期。还有其他选择吗?DatePickerCell会识别为空或未设置值的某些特殊日期标记或对象?

您想知道如何显示日期,对吗?然后将焦点从getValue移开,转而考虑覆盖Column类中的render方法。render方法有一个对象参数,就像getValue一样,还有一个SafeHtmlBuilder的参数,您可以将对象值的表示形式附加到该参数中。测试getStartTime,如果它为null,则将[unset]或其他任何内容附加到该SafeThmlBuilder。您甚至可以使用HTMLIMG标记或任何您喜欢的东西来附加一个时钟面的图像,其中有一个红色的删除线,因为render只是附加将放入单元格中的HTML


的第10版中提供了一个新类,它与此没有直接关系,但在另一个上下文中可能对您有用。它被称为。它是一个泛型,围绕着您正在使用的类,在本例中是Date。它提供了一种使用提供的方法显式区分null值和unset值等的方法。快速阅读-由于您处理的是空日期,这可能在您的设计中的其他地方很有用。

您想知道如何显示日期,对吗?然后将焦点从getValue移开,转而考虑覆盖Column类中的render方法。render方法有一个对象参数,就像getValue一样,还有一个SafeHtmlBuilder的参数,您可以将对象值的表示形式附加到该参数中。测试getStartTime,如果它为null,则将[unset]或其他任何内容附加到该SafeThmlBuilder。您甚至可以使用HTMLIMG标记或任何您喜欢的东西来附加一个时钟面的图像,其中有一个红色的删除线,因为render只是附加将放入单元格中的HTML

的第10版中提供了一个新类,它与此没有直接关系,但在另一个上下文中可能对您有用。它被称为。它是一个泛型,围绕着您正在使用的类,在本例中是Date。它提供了一种使用提供的方法显式区分null值和unset值等的方法。快速阅读-由于您处理的是空日期,这可能在设计中的其他地方很有用。

DatePickerCell不支持空值。覆盖渲染是不够的,因为当您单击渲染单元时,NPE是从方法onEnterKeyDown抛出的

您必须在OneInterkeyDown中实现自己的单元,并提供空保护:

if (date != null) {
    datePicker.setCurrentMonth(date);
}
全班:

public class DatePickerCell extends AbstractEditableCell<Date, Date> {

private static final int ESCAPE = 27;

private final DatePicker datePicker;
private final DateTimeFormat format;
private int offsetX = 10;
private int offsetY = 10;
private Object lastKey;
private Element lastParent;
private int lastIndex;
private int lastColumn;
private Date lastValue;
private PopupPanel panel;
private final SafeHtmlRenderer<String> renderer;
private ValueUpdater<Date> valueUpdater;

/**
 * Constructs a new DatePickerCell that uses the date/time format given by
 * {@link DateTimeFormat#getFullDateFormat}.
 */
@SuppressWarnings("deprecation")
public DatePickerCell() {
    this(DateTimeFormat.getFullDateFormat(), SimpleSafeHtmlRenderer.getInstance());
}

/**
 * Constructs a new DatePickerCell that uses the given date/time format and
 * a {@link SimpleSafeHtmlRenderer}.
 * @param format a {@link DateTimeFormat} instance
 */
public DatePickerCell(DateTimeFormat format) {
    this(format, SimpleSafeHtmlRenderer.getInstance());
}

/**
 * Constructs a new DatePickerCell that uses the date/time format given by
 * {@link DateTimeFormat#getFullDateFormat} and the given
 * {@link SafeHtmlRenderer}.
 * @param renderer a {@link SafeHtmlRenderer SafeHtmlRenderer<String>}
 *            instance
 */
public DatePickerCell(SafeHtmlRenderer<String> renderer) {
    this(DateTimeFormat.getFormat(PredefinedFormat.DATE_FULL), renderer);
}

/**
 * Constructs a new DatePickerCell that uses the given date/time format and
 * {@link SafeHtmlRenderer}.
 * @param format a {@link DateTimeFormat} instance
 * @param renderer a {@link SafeHtmlRenderer SafeHtmlRenderer<String>}
 *            instance
 */
public DatePickerCell(DateTimeFormat format, SafeHtmlRenderer<String> renderer) {
    super(CLICK, KEYDOWN);
    if (format == null) {
        throw new IllegalArgumentException("format == null");
    }
    if (renderer == null) {
        throw new IllegalArgumentException("renderer == null");
    }
    this.format = format;
    this.renderer = renderer;

    this.datePicker = new DatePicker();
    this.panel = new PopupPanel(true, true) {
        @Override
        protected void onPreviewNativeEvent(NativePreviewEvent event) {
            if (Event.ONKEYUP == event.getTypeInt()) {
                if (event.getNativeEvent().getKeyCode() == ESCAPE) {
                    // Dismiss when escape is pressed
                    panel.hide();
                }
            }
        }
    };
    panel.addCloseHandler(new CloseHandler<PopupPanel>() {
        public void onClose(CloseEvent<PopupPanel> event) {
            lastKey = null;
            lastValue = null;
            lastIndex = -1;
            lastColumn = -1;
            if (lastParent != null && !event.isAutoClosed()) {
                // Refocus on the containing cell after the user selects a
                // value, but
                // not if the popup is auto closed.
                lastParent.focus();
            }
            lastParent = null;
        }
    });
    panel.add(datePicker);

    // Hide the panel and call valueUpdater.update when a date is selected
    datePicker.addValueChangeHandler(new ValueChangeHandler<Date>() {
        public void onValueChange(ValueChangeEvent<Date> event) {
            // Remember the values before hiding the popup.
            Element cellParent = lastParent;
            Date oldValue = lastValue;
            Object key = lastKey;
            int index = lastIndex;
            int column = lastColumn;
            panel.hide();

            // Update the cell and value updater.
            Date date = event.getValue();
            setViewData(key, date);
            setValue(new Context(index, column, key), cellParent, oldValue);
            if (valueUpdater != null) {
                valueUpdater.update(date);
            }
        }
    });
}

@Override
public boolean isEditing(Context context, Element parent, Date value) {
    return lastKey != null && lastKey.equals(context.getKey());
}

@Override
public void onBrowserEvent(Context context, Element parent, Date value, NativeEvent event, ValueUpdater<Date> valueUpdater) {
    super.onBrowserEvent(context, parent, value, event, valueUpdater);
    if (CLICK.equals(event.getType())) {
        onEnterKeyDown(context, parent, value, event, valueUpdater);
    }
}

@Override
public void render(Context context, Date value, SafeHtmlBuilder sb) {
    // Get the view data.
    Object key = context.getKey();
    Date viewData = getViewData(key);
    if (viewData != null && viewData.equals(value)) {
        clearViewData(key);
        viewData = null;
    }

    String s = null;
    if (viewData != null) {
        s = format.format(viewData);
    } else if (value != null) {
        s = format.format(value);
    }
    if (s != null) {
        sb.append(renderer.render(s));
    }
}

@Override
protected void onEnterKeyDown(Context context, Element parent, Date value, NativeEvent event, ValueUpdater<Date> valueUpdater) {
    this.lastKey = context.getKey();
    this.lastParent = parent;
    this.lastValue = value;
    this.lastIndex = context.getIndex();
    this.lastColumn = context.getColumn();
    this.valueUpdater = valueUpdater;

    Date viewData = getViewData(lastKey);
    Date date = (viewData == null) ? lastValue : viewData;
    if (date != null) {
        datePicker.setCurrentMonth(date);
    }
    datePicker.setValue(date);
    panel.setPopupPositionAndShow(new PositionCallback() {
        public void setPosition(int offsetWidth, int offsetHeight) {
            panel.setPopupPosition(lastParent.getAbsoluteLeft() + offsetX, lastParent.getAbsoluteTop() + offsetY);
        }
    });
}
}

DatePickerCell不支持空值。覆盖渲染是不够的,因为当您单击渲染单元时,NPE是从方法onEnterKeyDown抛出的

您必须在OneInterkeyDown中实现自己的单元,并提供空保护:

if (date != null) {
    datePicker.setCurrentMonth(date);
}
全班:

public class DatePickerCell extends AbstractEditableCell<Date, Date> {

private static final int ESCAPE = 27;

private final DatePicker datePicker;
private final DateTimeFormat format;
private int offsetX = 10;
private int offsetY = 10;
private Object lastKey;
private Element lastParent;
private int lastIndex;
private int lastColumn;
private Date lastValue;
private PopupPanel panel;
private final SafeHtmlRenderer<String> renderer;
private ValueUpdater<Date> valueUpdater;

/**
 * Constructs a new DatePickerCell that uses the date/time format given by
 * {@link DateTimeFormat#getFullDateFormat}.
 */
@SuppressWarnings("deprecation")
public DatePickerCell() {
    this(DateTimeFormat.getFullDateFormat(), SimpleSafeHtmlRenderer.getInstance());
}

/**
 * Constructs a new DatePickerCell that uses the given date/time format and
 * a {@link SimpleSafeHtmlRenderer}.
 * @param format a {@link DateTimeFormat} instance
 */
public DatePickerCell(DateTimeFormat format) {
    this(format, SimpleSafeHtmlRenderer.getInstance());
}

/**
 * Constructs a new DatePickerCell that uses the date/time format given by
 * {@link DateTimeFormat#getFullDateFormat} and the given
 * {@link SafeHtmlRenderer}.
 * @param renderer a {@link SafeHtmlRenderer SafeHtmlRenderer<String>}
 *            instance
 */
public DatePickerCell(SafeHtmlRenderer<String> renderer) {
    this(DateTimeFormat.getFormat(PredefinedFormat.DATE_FULL), renderer);
}

/**
 * Constructs a new DatePickerCell that uses the given date/time format and
 * {@link SafeHtmlRenderer}.
 * @param format a {@link DateTimeFormat} instance
 * @param renderer a {@link SafeHtmlRenderer SafeHtmlRenderer<String>}
 *            instance
 */
public DatePickerCell(DateTimeFormat format, SafeHtmlRenderer<String> renderer) {
    super(CLICK, KEYDOWN);
    if (format == null) {
        throw new IllegalArgumentException("format == null");
    }
    if (renderer == null) {
        throw new IllegalArgumentException("renderer == null");
    }
    this.format = format;
    this.renderer = renderer;

    this.datePicker = new DatePicker();
    this.panel = new PopupPanel(true, true) {
        @Override
        protected void onPreviewNativeEvent(NativePreviewEvent event) {
            if (Event.ONKEYUP == event.getTypeInt()) {
                if (event.getNativeEvent().getKeyCode() == ESCAPE) {
                    // Dismiss when escape is pressed
                    panel.hide();
                }
            }
        }
    };
    panel.addCloseHandler(new CloseHandler<PopupPanel>() {
        public void onClose(CloseEvent<PopupPanel> event) {
            lastKey = null;
            lastValue = null;
            lastIndex = -1;
            lastColumn = -1;
            if (lastParent != null && !event.isAutoClosed()) {
                // Refocus on the containing cell after the user selects a
                // value, but
                // not if the popup is auto closed.
                lastParent.focus();
            }
            lastParent = null;
        }
    });
    panel.add(datePicker);

    // Hide the panel and call valueUpdater.update when a date is selected
    datePicker.addValueChangeHandler(new ValueChangeHandler<Date>() {
        public void onValueChange(ValueChangeEvent<Date> event) {
            // Remember the values before hiding the popup.
            Element cellParent = lastParent;
            Date oldValue = lastValue;
            Object key = lastKey;
            int index = lastIndex;
            int column = lastColumn;
            panel.hide();

            // Update the cell and value updater.
            Date date = event.getValue();
            setViewData(key, date);
            setValue(new Context(index, column, key), cellParent, oldValue);
            if (valueUpdater != null) {
                valueUpdater.update(date);
            }
        }
    });
}

@Override
public boolean isEditing(Context context, Element parent, Date value) {
    return lastKey != null && lastKey.equals(context.getKey());
}

@Override
public void onBrowserEvent(Context context, Element parent, Date value, NativeEvent event, ValueUpdater<Date> valueUpdater) {
    super.onBrowserEvent(context, parent, value, event, valueUpdater);
    if (CLICK.equals(event.getType())) {
        onEnterKeyDown(context, parent, value, event, valueUpdater);
    }
}

@Override
public void render(Context context, Date value, SafeHtmlBuilder sb) {
    // Get the view data.
    Object key = context.getKey();
    Date viewData = getViewData(key);
    if (viewData != null && viewData.equals(value)) {
        clearViewData(key);
        viewData = null;
    }

    String s = null;
    if (viewData != null) {
        s = format.format(viewData);
    } else if (value != null) {
        s = format.format(value);
    }
    if (s != null) {
        sb.append(renderer.render(s));
    }
}

@Override
protected void onEnterKeyDown(Context context, Element parent, Date value, NativeEvent event, ValueUpdater<Date> valueUpdater) {
    this.lastKey = context.getKey();
    this.lastParent = parent;
    this.lastValue = value;
    this.lastIndex = context.getIndex();
    this.lastColumn = context.getColumn();
    this.valueUpdater = valueUpdater;

    Date viewData = getViewData(lastKey);
    Date date = (viewData == null) ? lastValue : viewData;
    if (date != null) {
        datePicker.setCurrentMonth(date);
    }
    datePicker.setValue(date);
    panel.setPopupPositionAndShow(new PositionCallback() {
        public void setPosition(int offsetWidth, int offsetHeight) {
            panel.setPopupPosition(lastParent.getAbsoluteLeft() + offsetX, lastParent.getAbsoluteTop() + offsetY);
        }
    });
}
}