gpt4 book ai didi

java - Netbeans OptionsPanelController 按钮焦点

转载 作者:行者123 更新时间:2023-12-02 03:24:59 25 4
gpt4 key购买 nike

我正在使用 netbeans 平台的 OptionsPanelController

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

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

如何使其默认不聚焦。

注意:

由于它是一个netbeans平台应用程序,我打开了工具->选项
来自 Netbeans IDE,在该对话框中默认情况下也会聚焦“确定”按钮。

最佳答案

在 netbeans 源代码中的私有(private)包和最终类中,这种行为是硬编码的,因此可以做到,但需要修改 netbeans 源代码并更改代码以取决于您自己的版本netbeans,或使用反射或 java 字节码注入(inject)来覆盖现有行为。

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

更具体地说,OptionsDialogImpl.showOptionsDialog(...) 方法创建一个 DialogDisplayer 对象,该对象的默认选定值设置为 DialogDescriptor.OK_OPTION,这会导致每当打开“工具”->“选项”窗口时都会选择“确定”按钮。

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

一旦您 checkout /克隆源代码,您将需要编辑 OptionsDisplayerImpl.java 中第 204 行左右的内容,用您喜欢的按钮(例如 DialogDescriptor.CANCEL_OPTION)替换输入参数 DialogDescriptor.OK_OPTION。下面给出了您需要编辑的行。

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

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

示例代码:

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黑魔法,拦截类加载器处加载的字节码,并在加载到JVM之前对其进行更改。例如使用字节码操作库,例如 AspectJ、Javassist、ASM 或 CGLib

关于java - Netbeans OptionsPanelController 按钮焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39073794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com