2014-09-12 43 views
1

我想在每次保存特定的數據對象時進行一些處理。如果我正確理解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)); 
    } 
} 

回答

1

你試試這個?

http://wiki.netbeans.org/DevFaqListenForSaveEvents

此外,如果你想聽聽全球保存的事件,似乎就可以做了。

https://netbeans.org/bugzilla/show_bug.cgi?id=140719

+0

我的問題的解決方案受到您發佈的第一個鏈接的啓發。儘管如此,它可以以某種方式實現,但我只能聽到從修改狀態到未修改狀態的所有更改。我只是玩了第二個鏈接,這很有趣,因爲我現在可以真正聽取只保存事件。但是,正如您還注意到的,此OnSaveTask API可根據MIME類型用於全局保存事件。我進一步瞭解了一點,但現在我要處理的問題是,我想根據通過創建文件檢索的特定DataObject執行特定的操作。 – 2014-09-13 22:17:16

+0

因此,我創建了一個File,爲它獲取一個DataObject,然後我想將一個保存回調關聯到它。所以如果我創建兩個不同的文件,我會得到兩個不同的DO,最後我需要兩個不同的回調對象(不是實現,只是對象)。使用OnSaveTask,我可以通過關聯的文檔決定 - 每個OnSaveTask都使用上下文創建,該上下文鏈接到正在保存的文檔。所以我將我的不同回調作爲屬性添加到我的數據對象的文檔中。然後在OnSaveTask實現中,我通過Document.getProperty(key)檢索它並進行處理。 – 2014-09-13 22:23:45

+1

因此,最終完成任務,但對我來說,它似乎仍然有點像解決方法。我會多給Savable API幾次嘗試,因爲這仍然看起來像是正確的解決方案(我仍然感到驚訝,簡單的嘗試它沒有工作)。無論如何,謝謝,它現在看起來比屬性更改監聽器好一點:) – 2014-09-13 22:25:41

相關問題