我有这样的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。
当我像我写的那样这样做时,我只看到我的用户的IORs object:
IOR :0123405948239481293812312903891208320131293812381023
IOR: 0092930912617819919191818173666288810010199181919919等等..。
如何通过这种方式查看他们的toString();在DefaultListModel中表示?我不想这样做:
model.addElement(users[i].toString());
这不是重点。当我使用RMI而不是CORBA时,model.addElement(users[i]);正是我所需要的,因为我看到用户字符串表示。但我需要使用CORBA,并将其存储在corba-user-objects,(而不是字符串) DefaultListModel中。拜托救救我。
发布于 2012-10-07 15:21:37
一种方法是创建一个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所指出的,请小心您在toString()中放置的代码,因为每次需要显示列表时都会调用它--或者显示最新的数据可能正是您想要的。
发布于 2012-10-07 15:19:50
我猜想存根的toString()方法实际上并不调用远程CORBA对象的toString()方法。尝试使用另一个方法名(如getName()),并使用调用此方法的自定义呈现器。
也就是说,将用户建模为远程CORBA对象真的是个好主意吗?这将导致大量或远程方法调用,只是为了显示用户的名称,而该方法调用基本上不在您的控制范围内,因为Swing组件将生成这些调用。你不应该用DTO代替吗?
https://stackoverflow.com/questions/12769997
复制相似问题