У меня есть такой интерфейс 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-объекты, не строки. Пожалуйста помоги.
Один из способов сделать это — создать класс 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 (), так как он вызывается каждый раз, когда требуется показать список — или отображение самых свежих данных может быть именно тем, что вы хотите.
Я предполагаю, что метод заглушки toString () на самом деле не вызывает метод toString () удаленного объекта CORBA. Попробуйте использовать другое имя метода (например, getName()
), и используйте пользовательский рендерер, который вызывает этот метод.
Тем не менее, действительно ли хорошая идея смоделировать пользователя как удаленный объект CORBA? Это приведет к тому, что многие или удаленные вызовы методов будут просто отображать имена пользователей, и эти вызовы методов в основном находятся вне вашего контроля, поскольку компоненты Swing будут их создавать. Разве вы не должны использовать DTO вместо этого?