1

私はそのようなIDLインターフェースを持っています:

interface User
{
    string toString();
    //..
};

interface Group
{
    typedef sequence<User> Users;
    Users getUsers();

};

それを C++ に翻訳すると、次のような sth が得られました。

// ...
Group::Users* GroupImpl::getUsers()
{
    // ..return sequence of 'User'-objects
}

クライアント側 (Java で記述) では、ユーザーに表示したいと考えています。私はこのようにします:

public void showAllUsers() 
{
    User[] users = interface_obj.getUsers();
    if(users.length != 0)
    {
        DefaultListModel model = new DefaultListModel();
        for(int i=0; i<users.length; i++)
            model.addElement(users[i]);
        this.usersList.setModel(model);
    }
}

this.usersList はJList.

私が書いたようにこれを行うと、Users オブジェクトの IOR のみが表示されます。

IOR :0123405948239481293812312903891208320131293812381023
IOR: 0092930912617819919191818173666288810010199181919919

等々 ...

そのようにする方法、彼らの toString(); を見るために。DefaultListModelの表現?私はこれをしたくありません:

model.addElement(users[i].toString());

それはポイントではありません。CORBA の代わりに RMI を使用すると、model.addElement(users[i]);ユーザーの文字列表現が表示されるため、まさに必要なものです。しかし、文字列ではなく、CORBA を使用して DefaultListModel corba-user- objectsに格納する必要があります。助けてください。

4

2 に答える 2

3

スタブの toString() メソッドは、実際にはリモート CORBA オブジェクトの toString() メソッドを呼び出していないと思います。別のメソッド名 ( などgetName()) を使用してみて、このメソッドを呼び出すカスタム レンダラーを使用してください。

とはいえ、User をリモート CORBA オブジェクトとしてモデル化することは本当に良い考えなのでしょうか? これにより、ユーザーの名前を表示するためだけに多数またはリモートのメソッド呼び出しが発生します。これらのメソッド呼び出しは、Swing コンポーネントが作成するため、基本的に制御できません。代わりに DTO を使用すべきではありませんか?

于 2012-10-07T15:19:50.373 に答える
1

それを行う 1 つの方法は、リスト モデルに配置するインスタンスを持つ UserView クラスを作成することです。

public class UserView {

    private final User corbaUser;

    public UserView(User corbaUser) {
        this.corbaUser = corbaUser
    }

    @Override
    public String toString() {
       String ret = null;
       // construct the string as you want here
       return ret;
    }
}

編集:

JB Nizet が指摘したように、リストを表示する必要があるたびに呼び出されるため、 toString() に入れるコードには注意してください。または、最新のデータの表示がまさにあなたが望むものかもしれません。

于 2012-10-07T15:21:37.873 に答える