【问题标题】:Java Swing, Corba Objects - How to store Corba objects in DefaultListModel?Java Swing,Corba 对象 - 如何在 DefaultListModel 中存储 Corba 对象?
【发布时间】:2012-09-28 00:16:33
【问题描述】:

我有这样的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:

IOR :0123405948239481293812312903891208320131293812381023
IOR: 0092930912617819919191818173666288810010199181919919

等等……

如何做到这一点,看看他们的 toString(); DefaultListModel 中的表示?我不想这样做:

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

这不是重点。当我使用 RMI 而不是 CORBA 时,model.addElement(users[i]); 正是我所需要的,因为我看到了用户字符串表示。 但我需要使用 CORBA 并存储在 DefaultListModel corba-user-objects 中,而不是字符串。请帮忙。

【问题讨论】:

    标签: java c++ swing corba defaultlistmodel


    【解决方案1】:

    我猜存根的 toString() 方法实际上并没有调用远程 CORBA 对象的 toString() 方法。尝试使用其他方法名称(如getName()),并使用调用此方法的自定义渲染器。

    也就是说,将用户建模为远程 CORBA 对象真的是个好主意吗?这将导致大量或远程方法调用只是为了显示用户的名称,而这些方法调用基本上是您无法控制的,因为 Swing 组件会生成它们。你不应该改用 DTO 吗?

    【讨论】:

    • 您能多写一些关于 DTO 的内容吗?没听过这个词,怎么弄的?
    • DTO 是一个数据传输对象。它只是返回一个包含用户信息的数据结构,而不是返回对远程用户对象的引用。例如,请参阅martinfowler.com/eaaCatalog/dataTransferObject.html
    【解决方案2】:

    一种方法是创建一个 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() 中的代码,因为每次需要显示列表时都会调用它 - 或者显示最新数据可能正是您想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-29
      • 2012-11-18
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多