我想在每次保存特定DataObject时进行一些处理。如果我正确理解NetBeans IDE API,则可以使用Savable接口来实现自定义编辑器的保存选项。这里的问题是我不想实现自己的编辑器,也不想实现DataObject。我有一个MIME类型,由默认的Gsf编辑器(通用脚本语言api)编辑,并有一个GsfDataObject(我期望与DOSavable)。我想保留所有这些,只是为了添加一个钩子,可能是一个回调方法或者其他东西,每次在给定的GsfDataObject上进行保存时都会调用它(我想要调用默认的保存操作,我不想覆盖它。)
到目前为止,我来到这个简单的解决方案,但它似乎很难看(它或多或少受到http://wiki.netbeans.org/DevFaqListenForSaveEvents的启发):
// I have a FileObject fobj
final DataObject dobj = DataObject.find(fobj);
dobj.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(DataObject.PROP_MODIFIED)) {
if (!((Boolean) evt.getOldValue()) & ((Boolean) evt.getNewValue())) {
System.out.println(">>>> here it gets modified");
} else {
System.out.println(">>>> here the data object gets saved");
}
}
}
});
但是,仅在保存完成时才会调用此方法,但是在修改文件时也不会调用此方法,但是Ctrl + Z会恢复修改。它仅检查数据对象是否将其状态从修改更改为未修改。有没有办法只挂钩保存事件?
P.S。:我试图调用新的SJDOSavable(dobj).add();在DataObject被修改然后在另一个分支中删除它的那一刻。但是,不会调用handleSave方法。 SJDOSavable类是根据DataSystems API中的DOSavable实现的简单Savable:
private static final class SJDOSavable extends AbstractSavable implements Icon {
final DataObject obj;
public SJDOSavable(DataObject obj) {
this.obj = obj;
}
@Override
public String findDisplayName() {
return obj.getNodeDelegate().getDisplayName();
}
@Override
protected void handleSave() throws IOException {
System.out.println(">>>>> but this does not get called");
}
@Override
public boolean equals(Object other) {
if (other instanceof SJDOSavable) {
SJDOSavable dos = (SJDOSavable) other;
return obj.equals(dos.obj);
}
return false;
}
@Override
public int hashCode() {
return obj.hashCode();
}
final void remove() {
unregister();
}
final void add() {
register();
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
icon().paintIcon(c, g, x, y);
}
@Override
public int getIconWidth() {
return icon().getIconWidth();
}
@Override
public int getIconHeight() {
return icon().getIconHeight();
}
private Icon icon() {
return ImageUtilities.image2Icon(obj.getNodeDelegate().getIcon(BeanInfo.ICON_COLOR_16x16));
}
}
答案 0 :(得分:1)