Java Swing:使用jtable绑定复杂对象列表
我正在用Netbeans在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
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