1

我正在使用多个工具栏在 netBeans 中构建用户界面(手动编码,更灵活)。

我想要做的是为每个按钮创建一个 actionListener。我正在从 XML 中检索函数的名称并将它们解析为字符串。我将在一个单独的类中为这些函数编写实现,但我的问题如下:

如何在函数名称和包含它的名称的字符串之间建立链接?

示例:字符串是Open(),函数将是Open(someParameter),并且在定义类中会有static void Open(param)

4

3 回答 3

1

在我看来,您正在寻找相当于 Java 中的 JS“eval”函数。可能会有所帮助。尽管如此,正如@Max 所说,这通常不是一个好主意,您可能需要重新考虑您的设计。

于 2011-12-13T10:21:09.537 回答
1

首先,请考虑我对您从字符串解决的动态按钮行为的想法的评论是一种错误的方法。但是,如果您仍然需要您所要求的,那么您需要的是Reflection API

这是一个例子:

    Class c = SomeClassWithMethods.class;
    Method m = c.getMethod("someMethodName", String.class, Integer.class, Integer.TYPE);
    m.invoke(baseObjectFromWhichToCallTheMethod, "stringParam", 10, 5);

添加:

另一种选择,它比反射更漂亮,但仍然是一个凌乱的设计,是使用映射将它们链接Strings到方法。代码有点长,但从 Java 的角度来看,它比为您的任务使用反射要好得多(除非您有一些我不知道的特定要求)。这就是它的工作方式:

//Interface whose instances will bind strings to methods
interface ButtonClickHandler {
    void onClick();
}

class SomeClassYouNeed {
    //One of the methods that will be bound to "onButtonOneClick()"
    public void onButtonOneClick() {
        log.info("ButtonOneClick method is called");
    }

    public void onButtonTwoClick() {
        log.info("ButtonTwoClick method is called");
    }

    //Map that will hold your links
    private static Map<String, ButtonClickHandler> buttonActionMap;

    //Static constructor to initialize the map
    static {
        buttonActionMap = new Map<String, ButtonClickHandler>();
        buttonActionMap.put("onButtonOneClick()",new ButtonClickHandler() {
            @Override
            public void onClick() {
                onButtonOneClick();
            }
        });
        buttonActionMap.put("onButtonTwoClick()",new ButtonClickHandler() {
            @Override
            public void onClick() {
                onButtonTwoClick();
            }
        });
    }

    public void callByName(String methodName) {
        final ButtonClickHandler handler = buttonActionMap.get(methodName);
        if (handler == null) {
            throw new IllegalArgumentException("No handler found by name: "+methodName); 
        }
        handler.onClick();
    }
}

调用后callByName("onButtonTwoClick()"),它将获取ButtonClickHandler将使用静态方法onButtonTwoClick()处理按钮单击的相应实例。

于 2011-12-13T10:24:32.820 回答
0

如果我正确理解了您的问题,您正在尝试根据从 XML 文件中获取的一些字符串生成代码文件。我可以建议你使用这个来生成你的代码。对于教程,您可以访问链接。您甚至可以使用Java 反射 API。这是教程的链接

这取决于您,您使用上述两个中的哪一个。

于 2011-12-13T10:25:02.420 回答