4

編集 -- @Uri は、これが注釈の乱用であることを正しく指摘しました。注釈でメニュー データ自体を実際に作成しようとするのはばかげています。

それらはバインドには適していますが、メソッド名に反映するよりも明示的で柔軟であるため、テキストデータをメソッド (@Menu ("File") 部分) にリンクするためにそれらを使用することに固執すると思います。また、私はそれをいじることでかなり学びました。数日以内に回答としてコードをここに投稿します。

--元の投稿--

私はこれらの新しい注釈を使用していませんが、驚くほど興味深いものに見えます。ただし、構文を理解するのに苦労しています(または、より適切には、それを使用する最良の方法です)。

この質問に答えてコードを書いているときに、私のメソッドがかなり時代遅れであることに気づきました。

以前は、文字列を解析してメソッド構造を定義し、リフレクションを使用してそれをクラスに渡していましたが、注釈を使用するとメニュー構造がはるかに改善されると思います。

ファイル内のテスト クラスを次のようなものに置き換えたいと思います。

@TopMenu("File,Edit")
@Menu(name="File","Save,Load,Print,Preview,Quit")
@Menu(name="Print","Preview,Print")
@Menu(name="Edit","Copy,Paste")

public class TestMenu {
    @MenuItem ("Save")
    public void save() {
        System.out.println("saved");
    }
    @MenuItem ("Load")
    public void load() {
    System.out.println("loaded");
    }
...

クラス全体を、クラス インスタンスにバインドされた JMenuBar を作成して返すメソッドに、それ以上の入力なしで渡します。

最初の問題は、文字列の「デフォルト」を渡す方法がわからないことです。それらはすべて、("value") だけでなく (attribute="value") を持ちたいのですが、これを行うことはできますか? 私はそれがなくても生きていけるが、少し冗長だ。括弧や引用符を取り除くことができればさらに良いのですが、息を止めていません (そうするには、メニュー項目ごとに個別のインターフェイスを定義する必要があると思いますが、それは受け入れられません) )。

2 つ目は、1 つのクラスに複数の @Menu タグを配置するのが好きではありません。単一の文字列を解析することでこれを回避できましたが、別の方法があるかどうか疑問に思っていました。

最も重要なのは、すでにこれを行うライブラリはありますか? (誰も思いつかない場合は、他の誰かが興味を持っている場合に備えて、動作するようになったらこのスレッドにコードを公開します。)

4

3 に答える 3

2

複数の注釈が添付されているのを見た方法は、コンテナー注釈を使用してから、アイテムを配列として指定することです。

@Retention(RetentionPolicy.RUNTIME)
public @interface Menu {
    String name();
    String[] children();
}

@Retention(RetentionPolicy.RUNTIME)
public @interface MenuBar {
    Menu[] value();
}

@Retention(RetentionPolicy.RUNTIME)
public @interface MenuItem {
    String value();
}

@MenuBar(
    {
        @Menu(name="File", children= {"Save","Load","Print","Preview","Quit"}),
        @Menu(name="Print", children= {"Preview","Print"}),
        @Menu(name="Edit", children= {"Copy","Paste"})
    }
)
public class TestMenu {
    @MenuItem ("Save")
    public void save() {
        System.out.println("saved");
    }

    @MenuItem ("Load")
    public void load() {
        System.out.println("loaded");
    }
}
于 2009-01-27T00:17:30.193 に答える
0
  • 注釈のデフォルト値を定義できます-これが例ですString str() default "text";
  • これを簡単に克服することはできません。Menus文字列の配列を受け入れる注釈を定義できます
于 2009-01-26T23:29:48.747 に答える