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);

追加した:

もう 1 つのオプションは、リフレクションよりも少しきれいですが、それでも厄介な設計ですが、マップを使用してそれら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()")それぞれのインスタンスをフェッチします。ButtonClickHandleronButtonTwoClick()

于 2011-12-13T10:24:32.820 に答える
0

私があなたの質問を正しく理解しているなら、あなたはXMLファイルから取られたいくつかの文字列に基づいてあなたのコードファイルを生成しようとしています。コードを生成するために、このライブラリを提案できます。チュートリアルについては、このリンクにアクセスしてください。JavaReflectionAPIを使用することもできます。これがチュートリアルへのリンクです。

上記の2つのうちどちらを使用するかはあなた次第です。

于 2011-12-13T10:25:02.420 に答える