【发布时间】:2023-04-03 15:52:01
【问题描述】:
问题是我正在处理来自JCalendar 库的IDateEditor 接口实现,我注意到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);
}
}
【问题讨论】:
-
因为更改通知是编辑的固有责任 - 其他人不应干涉
-
@kleopatra 你需要回答这个问题!
-
您的实现中存在一个小错误:向某个对象添加侦听器的客户端期望 that 对象作为事件源,因此到某个委托的干净路由意味着拦截来自委托的任何通知并在将源设置为自身后重新触发
-
@kleopatra 感谢您指出这一点,我会记住这一点 :)
标签: java swing event-handling jcalendar