好吧,我正在研究JCalendarIDateEditor
库的接口实现,我注意到Component.firePropertyChange(String propertyName, Object oldValue, Object newValue)方法不是公共的,而是受保护的。情况如下图所示:
public class DateFormattedTextField implements IDateEditor {
private JFormattedTextField editor;
private DateUtil dateUtil;
...
@Override
public void setDate(Date date) {
Date oldDate = (Date)editor.getValue();
if(dateUtil.checkDate(date)){
editor.setValue(date);
editor.firePropertyChange("date", oldDate, date); // <-- error here
}
}
}
如您所见,由于此方法受到保护,我无法触发属性更改。当然,如果我让我的类从JFormattedTextfield扩展而不是使用简单的变量,我可以轻松摆脱这个问题。
public class DateFormattedTextField extends JFormattedTextField implements IDateEditor {
private DateUtil dateUtil;
...
@Override
public void setDate(Date date) {
Date oldDate = (Date)getValue();
if(dateUtil.checkDate(date)){
setValue(date);
firePropertyChange("date", oldDate, date); // <-- No problem here
}
}
}
但这不是我要问的。我想知道:为什么这种方法受到保护?
我知道这应该是一些设计问题,但我不知道为什么会这样,特别是考虑到大多数触发属性更改事件的方法都是公开的:
也许最有经验的开发人员可以对此有所了解。提前致谢。
附录:
到目前为止,这是我的代码。随意使用/修改/玩它。
public class DateFormattedTextField implements IDateEditor {
private JFormattedTextField editor;
private DateUtil dateUtil;
private DateFormat dateFormat;
private String dateFormatString;
public DateFormattedTextField(){
dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
editor = new JFormattedTextField(dateFormat);
editor.setColumns(10);
editor.setFocusLostBehavior(JFormattedTextField.COMMIT_OR_REVERT);
dateUtil = new DateUtil();
}
@Override
public Date getDate() {
return (Date)editor.getValue();
}
@Override
public void setDate(Date date) {
Date oldDate = (Date)editor.getValue();
if(dateUtil.checkDate(date)){
editor.setValue(date);
editor.firePropertyChange("date", oldDate, date); // <-- error here
}
}
@Override
public void setDateFormatString(String dateFormatString) {
this.dateFormatString = dateFormatString;
}
@Override
public String getDateFormatString() {
return this.dateFormatString;
}
@Override
public void setSelectableDateRange(Date min, Date max) {
dateUtil.setSelectableDateRange(min, max);
}
@Override
public Date getMaxSelectableDate() {
return dateUtil.getMaxSelectableDate();
}
@Override
public Date getMinSelectableDate() {
return dateUtil.getMinSelectableDate();
}
@Override
public void setMaxSelectableDate(Date max) {
dateUtil.setMaxSelectableDate(max);
}
@Override
public void setMinSelectableDate(Date min) {
dateUtil.setMinSelectableDate(min);
}
@Override
public JComponent getUiComponent() {
return editor;
}
@Override
public void setLocale(Locale locale) {
editor.setLocale(locale); // to be reviewed
}
@Override
public void setEnabled(boolean enabled) {
editor.setEnabled(enabled);
}
@Override
public void addPropertyChangeListener(PropertyChangeListener listener) {
editor.addPropertyChangeListener(listener);
}
@Override
public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
editor.addPropertyChangeListener(propertyName, listener);
}
@Override
public void removePropertyChangeListener(PropertyChangeListener listener) {
editor.removePropertyChangeListener(listener);
}
@Override
public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
editor.removePropertyChangeListener(propertyName, listener);
}
}