我想在每次保存特定的數據對象時進行一些處理。如果我正確理解NetBeans IDE API,則有一個可用於實現定製編輯器保存選項的Savable接口。這裏的問題是我不想實現我自己的編輯器,也不想實現DataObject。我有一個默認的Gsf編輯器(通用腳本語言API)編輯的MIME類型,並且有一個GsfDataObject(我期望用DOSavable)。我想保持這一切,只是爲了添加一個鉤子,也許是一個回調方法或什麼,每次在給定的GsfDataObject上完成保存時都會調用它(並且我希望調用默認的保存操作,我不想覆蓋它)。如何添加鉤子以保存NetBeans中現有DataObject的事件?
到目前爲止,我來到了這個簡單的解決方案,但它似乎醜陋(這是或多或少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類是一個簡單可保存根據DOSavable實現從數據系統API:
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));
}
}
我的問題的解決方案受到您發佈的第一個鏈接的啓發。儘管如此,它可以以某種方式實現,但我只能聽到從修改狀態到未修改狀態的所有更改。我只是玩了第二個鏈接,這很有趣,因爲我現在可以真正聽取只保存事件。但是,正如您還注意到的,此OnSaveTask API可根據MIME類型用於全局保存事件。我進一步瞭解了一點,但現在我要處理的問題是,我想根據通過創建文件檢索的特定DataObject執行特定的操作。 – 2014-09-13 22:17:16
因此,我創建了一個File,爲它獲取一個DataObject,然後我想將一個保存回調關聯到它。所以如果我創建兩個不同的文件,我會得到兩個不同的DO,最後我需要兩個不同的回調對象(不是實現,只是對象)。使用OnSaveTask,我可以通過關聯的文檔決定 - 每個OnSaveTask都使用上下文創建,該上下文鏈接到正在保存的文檔。所以我將我的不同回調作爲屬性添加到我的數據對象的文檔中。然後在OnSaveTask實現中,我通過Document.getProperty(key)檢索它並進行處理。 – 2014-09-13 22:23:45
因此,最終完成任務,但對我來說,它似乎仍然有點像解決方法。我會多給Savable API幾次嘗試,因爲這仍然看起來像是正確的解決方案(我仍然感到驚訝,簡單的嘗試它沒有工作)。無論如何,謝謝,它現在看起來比屬性更改監聽器好一點:) – 2014-09-13 22:25:41