NetBeans选择管理教程IIII 属性编辑器教程

本文来源:https://netbeans.apache.org/tutorials/60/nbm-property-editors.html

上一篇使用Nodes API讲述了Nodes API的某些功能。

本教程介绍了在NetBeans中使用属性编辑器的技术,包括提供自定义编辑器和自定义就地编辑器。具体来说,将涵盖以下内容:

  1. 为单个节点提供自己的属性编辑器
  2. 创建一个自定义编辑器
  3. 创建自定义就地编辑器
  4. 全局注册自定义属性编辑器

通常,您可能拥有标准属性编辑器不足的属性,或者属性类型是没有标准属性编辑器的类。NetBeans IDE包含许多常见的Swing类型的类,但是一组通用属性编辑器无法满足所有可能的需求。

本教程旨在作为之前的这些教程的补充,其代码基于其中的代码:

您将在上一教程中从上次结束的地方开始学习,该类MyNode包装了一个APIObject对象,并为其index属性提供了一个只读属性,并为其属性提供了一个读/写date属性。

创建属性编辑器

创建属性编辑器的基础非常简单。JavaBeans API提供了一个基类,该基类PropertyEditorSupport涵盖了大多数基础知识,并且可以用于创建几乎不需要任何工作的简单属性编辑器。

属性编辑器有两个用途:在字符串之间来回转换值以显示在属性表中,以及在设置新值时对其进行验证。首先,您将创建一个属性编辑器,该属性编辑器仅提供并接受不同格式的日期。

1、右键单击该org.myorg.myeditor软件包,然后选择“新建”>“ Java类”。在向导中,将类命名为DatePropertyEditor

2、在代码编辑器中,将类签名更改为extend PropertyEditorSupport

public class DatePropertyEditor extends PropertyEditorSupport {

3、落实setAsText()getAsText()如下:

    public String getAsText() {
        Date d = (Date) getValue();
        if (d == null) {
            return "No Date Set";
        }
        return new SimpleDateFormat("MM/dd/yy HH:mm:ss").format(d);
    }

    public void setAsText(String s) {
        try {
            setValue(new SimpleDateFormat("MM/dd/yy HH:mm:ss").parse(s));
        } catch (ParseException pe) {
            IllegalArgumentException iae = new IllegalArgumentException("Could not parse date");
            throw iae;
        }
    }

4、MyNode在代码编辑器中打开。更改声明的行,createSheet方法中,dateProperty以便将变量声明为,PropertySupport.Reflection而不是Property。您将调用特定于PropertySupport.Reflection以下方法的方法:

            Property indexProp = new PropertySupport.Reflection(obj, Integer.class, "getIndex", null);
//            Property dateProp = new PropertySupport.Reflection(obj, Date.class, "date");
            PropertySupport.Reflection dateProp = new PropertySupport.Reflection(obj, Date.class, "date");
            dateProp.setPropertyEditorClass(DatePropertyEditor.class);

6、运行模块套件,使用“文件”>“打开编辑器”打开您的编辑器组件,并注意Date属性的新格式,如下所示:

创建自定义编辑器

标准`java.beans.PropertyEditor`s的另一个基本功能是具有“自定义编辑器”的功能,当您单击属性表中属性旁边的“…”按钮时,该对话框通常会显示在对话框中。

关于实现这种编辑器的细节不在本教程的讨论范围之内,但是这里是基础知识:

1、在上实现以下两种方法DatePropertyEditor

    public Component getCustomEditor() {
        return new JLabel("I want to be a custom editor");
    }

    public boolean supportsCustomEditor() {
        return true;
    }

2、运行套件,现在在属性表中的属性旁边有一个“…”按钮,如下所示: 单击它,您的JLabel出现:

如果您是真正执行此操作,则可以创建一个JPanel,并嵌入某种日历和/或时钟组件以使其易于设置属性。正确执行此操作所需的代码将使您分心。

3、在继续操作之前,请删除以上两种方法

创建自定义编辑器

真正有用的是在属性表中嵌入一个更好的日期编辑器。NetBeans具有一个使之成为可能的API。它涉及一些代码,但是结果值得。

由于java.net上的 SwingLabs项目生成了一个不错的日期选择器组件,因此您只需重复使用该组件即可。因此,您需要做的第一件事就是将SwingX放入NetBeans。

1、swingx.jar从 SwingLabs站点下载(出于许可原因,不能将其保存在NetBeans CVS中)。

找到一个可以用的下载地址:http://www.java2s.com/Code/Jar/s/Downloadswingx092jar.htm

2、展开SelectionSuite,右键单击Modules节点,然后选择Add New Library,如下所示:

3、浏览swingx.jar刚刚下载的。点击下一步

4、再次单击“下一步”,注意代码名称库将为 org.jdesktop.swingx,然后单击“完成”。

5、右键单击主窗口中“项目”选项卡中的“My Editor”项目节点,然后选择“属性”。

6、在“库”页面中,单击“添加依赖项”按钮,然后在新的swingx-wrapper库包装器模块上添加依赖项。

现在您可以使用日期选择器了。这将涉及实现几个NetBeans特定的接口:

  • ExPropertyEditor-属性编辑器界面,属性表可以通过该界面传递“环境”(PropertyEnv)对象,该对象使编辑者可以访问Property其正在编辑的对象以及其他内容。

  • InplaceEditor.Factory-拥有一个对象的对象的接口 InplaceEditor

  • InplaceEditor-一个接口,允许提供自定义组件以在属性表中显示。

您将实现InplaceEditor.FactoryExPropertyEditor直接DatePropertyEditor,然后创建一个InplaceEditor嵌套类:

1、DatePropertyEditor如下更改签名:

public class DatePropertyEditor extends PropertyEditorSupport implements ExPropertyEditor, InplaceEditor.Factory {

2、与前面的示例一样,请按Ctrl-Shift-I修复导入,然后使用“实施所有抽象方法”来添加缺少的方法。

3、将以下方法添加到DatePropertyEditor

    public void attachEnv(PropertyEnv env) {
        env.registerInplaceEditorFactory(this);
    }

    private InplaceEditor ed = null;

    public InplaceEditor getInplaceEditor() {
        if (ed == null) {
            ed = new Inplace();
        }
        return ed;
    }

4、现在,您需要实现InplaceEditor自身。这将是一个拥有一个swingx JXDatePicker组件的对象,以及一些设置其值的管道方法,并在不再使用它时处置资源。它需要一些代码,但是非常简单。只需在其中创建Inplace一个静态嵌套类即可DatePropertyEditor

5、如果还没有,请按Ctrl-Shift-I修复导入。

6、再次运行套件,使用“文件”>“打开编辑器”打开您的编辑器(实际上不再是一个编辑器),选择的一个实例,MyNode然后单击属性表中date属性的值。请注意,将出现日期选择器弹出窗口,并且其行为与应有的行为完全相同,如下所示:

全局注册DatePropertyEditor

通常,注册属性编辑器以用于给定类型的所有属性通常很有用。实际上,您DatePropertyEditor通常对类型的任何属性都有用java.util.Date。虽然有用性不是是否应注册这种属性编辑器的主要决定因素,但是如果您的应用程序或模块将定期处理Date属性,则这样做可能会很有用。

这是注册方法,DatePropertyEditor以便该类型的任何属性java.util.Date都可以DatePropertyEditor在属性表中使用:

 1、右键单击“My Editor”项目,然后从弹出菜单中选择“属性”。

2、在项目属性对话框的“库”页面上,单击“添加依赖关系”,您需要添加对Module System API的依赖关系,以便可以子类化ModuleInstall以在startup.Type上运行一些代码ModuleInstall。该对话框应自动选择“模块系统API”。按Enter或单击“确定”以从“My Editor”模块添加对Modules API的依赖关系。

3、右键单击“org.myorg.myeditor项目中的包,然后选择“新建”>“其他”。在“ NetBeans模块开发”类别下,选择“模块安装程序”。单击完成。org.openide.modules.ModuleInstall将为您创建的子类-此类包含将在启动期间运行的代码。

4、实现restored()在启动过程中运行的方法,如下所示:

    @Override
    public void restored() {
        PropertyEditorManager.registerEditor(Date.class, DatePropertyEditor.class);
    }

该代码将注册DatePropertyEditorjava.util.Date整个系统中该类型的所有属性的默认编辑器。

5、按Ctrl-Shift-I修复导入。

请记住,只有在确实需要时才应该这样做– ModuleInstall类会减慢应用程序的启动速度,因为它们意味着启动期间必须运行更多的代码。因此,应尽可能避免使用它们。但是,如果确实需要注册许多属性编辑器,则将它们聚合到一个在启动期间注册它们的单个模块中可能是有意义的。

如果要在模块中提供属性编辑器的类型,则最好将注册代码放置在静态块中,该类在加载该类时将被调用,例如

public class Foo {
    static {
         PropertyEditorManager.registerEditor(Foo.class, FooEditor.class);
    }
    //...

注意:如果不确定在典型的会话期间将使用属性编辑器,则可以使用更好的技术PropertyEditorManager.setEditorSearchPath(),将您的软件包添加到所返回的软件包数组中PropertyEditorManager.getEditorSearchPath()。上面的代码将导致FooEditor.class被加载到内存中,这将为不使用的内容支付大约1K的内存。对于一两个属性编辑器来说,这可能是可以接受的。要获得更多信息,最好将所有属性编辑器聚合到一个程序包中,适当地命名类并注册该程序包在搜索路径中。有关注册属性编辑器的更多信息,请参见“ PropertyEditorManager ” 的javadoc 。

使用PropertyPanel

尽管您不会详细介绍它,但是值得一提的是,属性表并不是Node.Property对象有用的唯一地方;也有在一个方便的UI类org.openide.explorer.PropertySheet类调用PropertyPanel。它的功能是显示一个属性,就像在属性表中显示的一样,提供一个编辑器字段和一个自定义编辑器按钮,或者您已经调用somePropertyPanel.setPreferences(PropertyPanel.PREF_CUSTOM_EDITOR),它将显示一个自定义编辑器Property。这是一种获取合适的UI组件的便捷方法,该UI组件用于编辑具有属性编辑器的任何getter / setter对。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值