Netbeans OptionsPanelController按钮焦点

时间:2016-08-22 07:39:54

标签: java netbeans

我正在使用netbeans平台' OptionsPanelController

来自https://platform.netbeans.org/tutorials/nbm-options.html本教程。

我的问题是, 通过使用此面板,Ok button默认为焦点。

默认情况下如何使其不会聚焦。

注意:

由于它是一个netbeans平台应用程序,我从Netbeans IDE打开了Tools->Options ,在该对话框中,默认情况下也是Ok按钮。

1 个答案:

答案 0 :(得分:2)

它的硬编码在netbeans源代码中的私有包和最终类中表现如此,因此可以完成,但需要修改netbeans源代码并将代码更改为依赖在您自己的netbeans版本上,或使用反射或java字节码注入来覆盖现有行为。

您需要修改的兴趣类别是: org.netbeans.api.options.OptionsDisplyer和 org.netbeans.api.options.OptionsDisplayerImpl

更具体地说,方法OptionsDialogImpl.showOptionsDialog(...)创建一个DialogDisplayer对象,其默认选择值设置为DialogDescriptor.OK_OPTION,这样只要打开Tools-> Options窗口,就会选择OK按钮。

你唯一的解决方法/黑客是: 选项1)构建您自己的netbeans版本,将硬编码行为更改为您所需的行为。您需要从源netbeans代码克隆和构建;请参阅以下网址提供的说明:http://wiki.netbeans.org/WorkingWithNetBeansSources#Try_NetBeans_buildSimply

一旦您签出/克隆源代码,您将需要在OptionsDisplayerImpl.java中的第204行周围编辑,替换输入参数DialogDescriptor.OK_OPTION,并使用您的首选按钮,例如DialogDescriptor.CANCEL_OPTION。您需要编辑的行如下所示。

descriptor = new DialogDescriptor(optionsPanel,title,modal,options,DialogDescriptor.OK_OPTION,DialogDescriptor.DEFAULT_ALIGN, null, null, false);

选项2)使用java反射执行一些黑魔法来访问和更改默认选定按钮的值,或者使用覆盖默认行为的自定义实现替换私有字段。

示例代码:

OptionsDisplayer displayer = OptionsDisplayer.getDefault();        
    Object impl = getField(displayer, "impl"); 
    if(impl != null){
        WeakReference<DialogDescriptor> descriptorRef = (WeakReference<DialogDescriptor>)getField(impl, "descriptorRef");
        if(descriptorRef != null){                
            DialogDescriptor descriptor = descriptorRef.get();
            //change default initial selected butten from "OK" to "CANCEL"
            descriptor.setValue(DialogDescriptor.CANCEL_OPTION); //change default initial selected butten from "OK" to "CANCEL"
        }
    }

/**
 * Java reflection utility method to get the Object for a given field regardless of whether it is private or not, by it's given field name.
 * @param obj The Object that contains the desired field.
 * @param fieldName The name of the field
 * @return The Object with the given fieldName found in Object 'obj'. Returns null if no such field exists.
 */
public static Object getField(Object obj, String fieldName) {
    Class tmpClass = obj.getClass();
    do {
        try {
            Field f = tmpClass.getDeclaredField(fieldName);
            if(f != null){
                f.setAccessible(true);
                return f.get(obj);
            }                
        } catch (NoSuchFieldException e) {
            tmpClass = tmpClass.getSuperclass();
        } catch (IllegalArgumentException | IllegalAccessException ex) {
            ex.printStackTrace();
            return null;
        }
    } while (tmpClass != null);
    return null; //null if not found
}

选项3)更多java black-magic,拦截类加载器上的字节码加载,并在它加载到JVM之前更改它。例如使用字节码操作库,如AspectJ,Javassist,ASM或CGLib