Java Netbeans选项面板控制器按钮焦点

Java Netbeans选项面板控制器按钮焦点,java,netbeans,Java,Netbeans,我正在使用netbeans平台的选项PanelController 来自本教程 我的问题是,, 通过使用此面板,默认情况下,Ok按钮处于聚焦状态 如何使其在默认情况下不聚焦 注意: 由于它是一个netbeans平台应用程序,我打开了Tools->Options 在Netbeans IDE中,默认情况下,对话框中的Ok按钮也是焦点。在Netbeans源代码的私有包和最终类中,它的行为是硬编码的,因此可以这样做,但需要修改Netbeans源代码并根据自己的Netbeans版本更改代码,或者使用反射或

我正在使用netbeans平台的
选项PanelController

来自本教程

我的问题是,, 通过使用此面板,默认情况下,
Ok按钮
处于聚焦状态

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

注意:

由于它是一个netbeans平台应用程序,我打开了
Tools->Options

在Netbeans IDE中,默认情况下,对话框中的Ok按钮也是焦点。

在Netbeans源代码的私有包和最终类中,它的行为是硬编码的,因此可以这样做,但需要修改Netbeans源代码并根据自己的Netbeans版本更改代码,或者使用反射或java字节码注入来覆盖现有行为

您需要修改的兴趣类别包括: org.netbeans.api.options.options显示层和 org.netbeans.api.options.options显示模板

更具体地说,方法optionDialogImpl.ShowOptionDialog(…)创建了一个DialogDisplayer对象,该对象的默认选定值设置为DialogDescriptor.OK_选项,这将导致在打开“工具->选项”窗口时选择“确定”按钮

您唯一的解决方法/技巧是: 选项1)构建您自己的netbeans版本,更改硬编码行为以满足您的需要。您需要从源netbeans代码克隆和构建;请参阅以下网址提供的说明:

签出/克隆源代码后,您将要在optionDisplayerImpl.java中的第204行附近进行编辑,将输入参数DialogDescriptor.OK_选项替换为首选按钮DialogDescriptor.CANCEL_选项。下面给出了需要编辑的行

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
}
optionDisplayer displayer=optionDisplayer.getDefault();
对象impl=getField(显示器,“impl”);
如果(impl!=null){
WeakReference descriptorRef=(WeakReference)getField(简称“descriptorRef”);
如果(描述符ref!=null){
DialogDescriptor descriptor=描述符ref.get();
//将默认初始选定按钮从“确定”更改为“取消”
descriptor.setValue(DialogDescriptor.CANCEL_选项);//将默认初始选中的butten从“确定”更改为“取消”
}
}
/**
*Java反射实用程序方法,通过给定字段名获取给定字段的对象,而不管它是否私有。
*@param obj包含所需字段的对象。
*@param fieldName字段的名称
*@返回在对象“obj”中找到的具有给定字段名的对象。如果不存在此类字段,则返回null。
*/
公共静态对象getField(对象obj,字符串fieldName){
类tmpClass=obj.getClass();
做{
试一试{
字段f=tmpClass.getDeclaredField(字段名);
如果(f!=null){
f、 setAccessible(true);
返回f.get(obj);
}                
}捕获(无此字段例外){
tmpClass=tmpClass.getSuperclass();
}捕获(IllegalArgumentException | IllegalAccessException ex){
例如printStackTrace();
返回null;
}
}while(tmpClass!=null);
返回null;//如果未找到,则返回null
}

选项3)更多java黑魔法,在类加载器处拦截字节码加载,并在将其加载到JVM之前对其进行更改。e、 g.使用字节码操纵库,如AspectJ、Javassist、ASM或CGLib

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

您需要修改的兴趣类别包括: org.netbeans.api.options.options显示层和 org.netbeans.api.options.options显示模板

更具体地说,方法optionDialogImpl.ShowOptionDialog(…)创建了一个DialogDisplayer对象,该对象的默认选定值设置为DialogDescriptor.OK_选项,这将导致在打开“工具->选项”窗口时选择“确定”按钮

您唯一的解决方法/技巧是: 选项1)构建您自己的netbeans版本,更改硬编码行为以满足您的需要。您需要从源netbeans代码克隆和构建;请参阅以下网址提供的说明:

签出/克隆源代码后,您将要在optionDisplayerImpl.java中的第204行附近进行编辑,将输入参数DialogDescriptor.OK_选项替换为首选按钮DialogDescriptor.CANCEL_选项。下面给出了需要编辑的行

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
}
optionDisplayer displayer=optionDisplayer.getDefault();
对象impl=getField(显示器,“impl”);
如果(impl!=null){
WeakReference descriptorRef=(WeakReference)getField(简称“descriptorRef”);
如果(描述符ref!=null){
DialogDescriptor descriptor=描述符ref.get();
//将默认初始选定按钮从“确定”更改为“取消”
descriptor.setValue(DialogDescriptor.CANCEL_选项);//将默认初始选中的butten从“确定”更改为“取消”
}
}
/**
*Java反射实用程序方法,通过给定字段名获取给定字段的对象,而不管它是否私有。
*