1

いくつかの異なる文字列フィールド (タイトル、著者、件名など) を持つ Book オブジェクトがあり、本のコレクションのこれらの各フィールドを表示するように GUI を設計しています。フィールドごとに、ラベル (フィールドに名前を付ける)、TextField (フィールドに保存された値を表示する)、および TextField を編集可能にして 2 番目を表示する編集ボタンを配置するパネルがあります。ボタンをクリックして、行った編集を保存します。

これらを個別にパネルにコーディングするのではなく、単一のラベル、TextField、およびボタンを備えた「フィールド パネル」を作成したいと考えています。次に、foreach ループを使用して、フィールドごとにこれらのパネルの 1 つを作成し (リストに格納)、これらのパネルをメイン パネルにロードします。

私は次のことが不可能であることを知っています:

Book b = new Book();
String[] fieldTitles = {title, author, subject, publisher};
for (String str : fieldTitles) { 
    FieldPanel fp = new FieldPanel();
    fp.namelabel.settext(str);
    fp.textField.settext(b.str);
}

しかし、最後の行で私がやろうとしていることを達成する別の方法はありますか?それは、名前付き文字列変数を使用してオブジェクトのフィールドを参照することですか? 言い換えれば、私がやりたいこと: objectInstance.stringVariable(ここで、stringVariable は objectInstance のフィールドの名前と一致します。

4

1 に答える 1

3

あなたは反射を探しています。このテーマについてはJava チュートリアルがあり、それを始めることができます。また、 Commons BeanUtilsSpring の util package のいくつかのクラスなど、リフレクションを容易にするための非常に多くのライブラリがあります。ほとんどのフレームワークには、何らかのリフレクション ヘルパー クラスが含まれています。これは、リフレクションを直接操作するのが面倒なためです。

あなたの場合の簡単な例として、Commons BeanUtils.getProperty()を使用して、次のように言うことができます:

fp.textField.settext((String) BeanUtils.getProperty(b, str));

手動で行う完全な例を次に示します。これにより、どのように適合するかを確認できます。

import java.lang.reflect.Field;

public class BasicReflectionGettingFieldValues {
    public static void main(String[] args) {
        FieldPanel fp = new FieldPanel();
        Book b = new Book("Mostly Harmless", "Douglas Adams");
        for (String str : Arrays.asList("author", "title")) {
            fp.namelabel.settext(str);
            fp.textField.settext(getField(b, str));
        }
    }

    private static String getField(Book b, String str) {
        try {
            Field field = Book.class.getDeclaredField(str);
            field.setAccessible(true);
            return (String) field.get(b);
        } catch (NoSuchFieldException e) {
            throw new IllegalStateException("Bad field name: " + str, e);
        } catch (IllegalAccessException e) {
            throw new IllegalStateException("Failed to access field " + str + " after making it accessible", e);
        }
    }

    static class Book {
        private String title;
        private String author;

        Book(String title, String author) {
            this.title = title;
            this.author = author;
        }
    }
    static class TextField {
        void settext(String s) {
            System.out.println("Setting text field to '" + s + "'");
        }
    }
    static class NameLabel {
        void settext(String s) {
            System.out.println("Setting name label to '" + s + "'");
        }
    }
    static class FieldPanel {
        private NameLabel namelabel = new NameLabel();
        private TextField textField = new TextField();
    }
}
于 2013-03-04T17:11:31.847 に答える