Java 如何添加一个钩子来保存NetBeans中现有DataObject的事件?

Java 如何添加一个钩子来保存NetBeans中现有DataObject的事件?,java,netbeans,netbeans-platform,netbeans-plugins,Java,Netbeans,Netbeans Platform,Netbeans Plugins,每次保存特定数据对象时,我都要进行一些处理。如果我正确理解NetBeans IDE API,那么有一个可保存的接口可用于实现自定义编辑器的保存选项。这里的问题是,我不想实现自己的编辑器,也不想实现DataObject。我有一个MIME类型,它由默认的Gsf编辑器(公共脚本语言api)编辑,并且有一个GsfDataObject(我希望使用DOSavable)。我想一直保持这种方式,只是为了添加一个钩子,可能是一个回调方法或其他东西,每次对给定的GsfDataObject进行保存时都会调用它(我希望

每次保存特定数据对象时,我都要进行一些处理。如果我正确理解NetBeans IDE API,那么有一个可保存的接口可用于实现自定义编辑器的保存选项。这里的问题是,我不想实现自己的编辑器,也不想实现DataObject。我有一个MIME类型,它由默认的Gsf编辑器(公共脚本语言api)编辑,并且有一个GsfDataObject(我希望使用DOSavable)。我想一直保持这种方式,只是为了添加一个钩子,可能是一个回调方法或其他东西,每次对给定的GsfDataObject进行保存时都会调用它(我希望调用一个默认的保存操作,我不想覆盖它)

到目前为止,我找到了这个简单的解决方案,但它看起来很难看(或多或少受到了以下因素的启发):

但是,这不仅在保存完成时调用,而且在文件被修改时调用,然后通过Ctrl+Z恢复修改。它只检查数据对象是否将其状态从修改更改为未修改。有没有办法只挂接保存事件

注意:我试图调用新的SJDOSavable(dobj).add();当DataObject被修改,然后在另一个分支中将其删除时。但是,不会调用handleSave方法。SJDOSavable类是一个简单的可保存类,根据数据系统API中的DOSavable实现:

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类型适用于全局保存事件。我更进一步了,但我现在要处理的问题是,我想根据通过创建文件检索的特定数据对象执行特定操作。因此,我创建了一个文件,为它获取了一个数据对象,然后我想将一个保存回调与之关联。因此,如果我创建两个不同的文件,我会得到两个不同的DO,最后我想要两个不同的回调对象(不是实现,只是对象)。对于OnSaveTask,我可以通过关联的文档来决定——每个OnSaveTask都是使用上下文创建的,上下文中有一个指向正在保存的文档的链接。因此,我将不同的回调作为属性添加到dataobject的文档中。然后在OnSaveTask实现中,我通过Document.getProperty(key)检索它并进行处理。因此,最终任务完成了,但对我来说,这似乎仍然有点像一种解决方法。我将对Savable 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));
   }
}