Java Swing:使用jtable绑定复杂对象列表

Java Swing:使用jtable绑定复杂对象列表,java,swing,netbeans,binding,Java,Swing,Netbeans,Binding,我正在用Netbeans在Swing中开发一个小应用程序。我目前可以在带有绑定的jTable中显示对象列表。但该对象的一个属性是另一个对象: public class CustomProp { private String description; private int value; //constructor, getters and setters... } public class MainObject { private int id; pr

我正在用Netbeans在Swing中开发一个小应用程序。我目前可以在带有绑定的jTable中显示对象列表。但该对象的一个属性是另一个对象:

public class CustomProp {
    private String description;
    private int value;

    //constructor, getters and setters...
}

public class MainObject {
    private int id;
    private String name;
    private boolean aBoolProp;
    private CustomProp myCustomProp;

    //constructors, getters and setters...
}
我有一个arraylist,其中有4个名为mainObjectsList的实例MainObject。jTable元素绑定表达式是
${mainObjectsList}


然后在jTable中,我可以看到我的objects属性,但在myCustomProps列中,我只能看到对象地址(mytest)。CustomProp@64ca87d5). 是否可以将绑定表达式配置为在jTable中显示对象属性的参数?

要了解发生了什么,您需要了解
jTable
如何将您提供的内容转换为可显示组件

这是不使用的。它本质上是为每个包含数据表示形式的
字符串的表单元格创建
JLabel

默认渲染器对您的
CustomProp
类型没有任何概念,因此它会调用
toString
,以获取
字符串
表示并显示它

这打开了一个途径-更改
自定义属性的
字符串
。这种方法会起作用,但由于以下几个原因,这种方法很难实现:

  • 您的对象不应该真的诱惑自己,这违反了关注点分离
  • 您可以在其他地方使用
    toString
    方法,例如在日志记录中,并且表中有意义的表示在那里没有意义
  • toString
    实际上不应该是对象契约的一部分-当添加新字段时,它应该可以更改。如果使用表中的表示形式,则情况并非如此(请参见1)
  • 话虽如此,第10项(“始终覆盖toString”)确实说明了
    toString
    可以是对象契约的一部分,如果它有大量的文档记录

    就我个人而言,我更愿意通过扩展以下内容来设置
    TableModel
    的列类:

    现在,您的表知道了带有
    CustomProp
    的列的类。创建自定义渲染器以渲染列:

    private static final class CustomPropRenderer extends DefaultTableCellRenderer {
    
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            final CustomProp prop = (CustomProp) value;
            final StringBuilder representation = new StringBuilder();
            //build a string representation of prop
            return super.getTableCellRendererComponent(table, representation.toString(), isSelected, hasFocus, row, column);
        }
    
    }
    
    并告诉您的
    JTable
    对类
    CustomProp
    的列使用渲染器:

    jTable.setDefaultRenderer(CustomProp.class, new CustomPropRenderer());
    
    编辑

    在@kleopatra的评论之后,我注意到了这个标签,我快速地在谷歌上搜索并找到了它。看起来它要么正是所需要的(要么可能完全不相关)


    您应该能够使用
    ${customProp.property}
    作为列的绑定。

    要了解发生了什么,您需要了解
    JTable
    如何将您提供的内容转换为可显示组件

    这是不使用的。它本质上是为每个包含数据表示形式的
    字符串的表单元格创建
    JLabel

    默认渲染器对您的
    CustomProp
    类型没有任何概念,因此它会调用
    toString
    ,以获取
    字符串
    表示并显示它

    这打开了一个途径-更改
    自定义属性的
    字符串
    。这种方法会起作用,但由于以下几个原因,这种方法很难实现:

  • 您的对象不应该真的诱惑自己,这违反了关注点分离
  • 您可以在其他地方使用
    toString
    方法,例如在日志记录中,并且表中有意义的表示在那里没有意义
  • toString
    实际上不应该是对象契约的一部分-当添加新字段时,它应该可以更改。如果使用表中的表示形式,则情况并非如此(请参见1)
  • 话虽如此,第10项(“始终覆盖toString”)确实说明了
    toString
    可以是对象契约的一部分,如果它有大量的文档记录

    就我个人而言,我更愿意通过扩展以下内容来设置
    TableModel
    的列类:

    现在,您的表知道了带有
    CustomProp
    的列的类。创建自定义渲染器以渲染列:

    private static final class CustomPropRenderer extends DefaultTableCellRenderer {
    
        @Override
        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            final CustomProp prop = (CustomProp) value;
            final StringBuilder representation = new StringBuilder();
            //build a string representation of prop
            return super.getTableCellRendererComponent(table, representation.toString(), isSelected, hasFocus, row, column);
        }
    
    }
    
    并告诉您的
    JTable
    对类
    CustomProp
    的列使用渲染器:

    jTable.setDefaultRenderer(CustomProp.class, new CustomPropRenderer());
    
    编辑

    在@kleopatra的评论之后,我注意到了这个标签,我快速地在谷歌上搜索并找到了它。看起来它要么正是所需要的(要么可能完全不相关)


    您应该能够使用
    ${customProp.property}
    作为列的绑定。

    您可能需要正确设置TableModel的列类,并为
    customProp
    提供自定义呈现。或者,您可以将
    CustomProp
    toString
    方法更改为返回您想要的内容-但是这有点老套。@BoristSpider您的评论应该是一个答案您到底在说什么“绑定”?如果是旧的beansbinding,则可以使用路径表达式,如TableColumnBinding的customProp.name。其他绑定框架很可能支持某些东西similar@StanislavL添加了一个答案。您可能需要正确设置TableModel的column类,并为
    CustomProp
    提供自定义渲染。或者,您可以将
    CustomProp
    toString
    方法更改为返回您想要的内容-但是这有点老套。@BoristSpider您的评论应该是一个答案您到底在说什么“绑定”?如果是旧的beansbinding,则可以使用路径表达式,如TableColumnBinding的customProp.name。其他绑定框架很可能支持某些东西similar@StanislavL添加了一个答案。虽然正确,但很可能不需要:OP使用绑定框架-只需通过路径绑定属性expression@kleopatraOP似乎正在将一个对象绑定到一个表行,因此可能需要提供一个ren