Java Swing, объекты Corba — Как хранить объекты Corba в DefaultListModel?

У меня есть такой интерфейс IDL:

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

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

};

Когда я перевел его на C ++, я получил вот что:

// ...
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,

Когда я делаю это, как я написал, я вижу только IOR моего объекта Users:

IOR :0123405948239481293812312903891208320131293812381023
IOR: 0092930912617819919191818173666288810010199181919919

и так далее …

Как это сделать, чтобы увидеть их toString (); представление в DefaultListModel? Я не хочу делать это:

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

не в этом дело. Когда я использую RMI вместо CORBA, model.addElement(users[i]); это именно то, что мне нужно, потому что я вижу пользовательское представление строки.
Но мне нужно использовать CORBA и хранить в DefaultListModel corba-user-объекты, не строки. Пожалуйста помоги.

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 (), так как он вызывается каждый раз, когда требуется показать список — или отображение самых свежих данных может быть именно тем, что вы хотите.

1

Другие решения

Я предполагаю, что метод заглушки toString () на самом деле не вызывает метод toString () удаленного объекта CORBA. Попробуйте использовать другое имя метода (например, getName()), и используйте пользовательский рендерер, который вызывает этот метод.

Тем не менее, действительно ли хорошая идея смоделировать пользователя как удаленный объект CORBA? Это приведет к тому, что многие или удаленные вызовы методов будут просто отображать имена пользователей, и эти вызовы методов в основном находятся вне вашего контроля, поскольку компоненты Swing будут их создавать. Разве вы не должны использовать DTO вместо этого?

3