JTable with multiple elements in one cell
我喜欢创建一个带有复选框和一两个可选文本字段的单元格。
如果我点击复选框,文本字段就会可见。我试图制作一张 ASCII 图片应该是什么样子:
1
2 3 |
[ ]
[X] [some string] [X] [value1] [value2] |
我知道如何创建自定义渲染器,但我不确定如何返回多个元素。如果我有一个复选框的渲染器,我只返回 JCheckBox:
1
2 3 4 5 6 7 8 |
class BooleanRenderer extends JCheckBox implements TableCellRenderer, UIResource
{ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { // doing some stuff… return this; } } |
@Thomas 等人。关于区分模型和视图是正确的。您的模型包括一个布尔状态和一些相应的文本;您的视图是一个可以切换的 JCheckBox 和可以更改的文本。您需要一个渲染器来显示模型的当前状态,还需要一个编辑器来允许更改状态。
在此示例中,类 Value 保存选定状态和基础数据,即 Double 值。 DataModel 实现了 TableModel,管理着一个 List<Value>。请注意,编辑器和渲染器都使用通用的 java.text.DecimalFormat。相关类 java.text.MessageFormat 可能对编写复选框的文本很有用。
您必须返回一个包含多个其他组件的组件(在您的情况下可能是 JPanel)。
参见下面的链接,其中 CellRenderer 返回多个条目(它是 ListCellRenderer,但基本相同)。
您还必须在表格模型中表示该结构,即单元格的值应该已经是布尔标志和其他值的组合。
- 我真的需要这样做吗?我可以使用分隔符将所有值存储在一个单元格中:checkbox|textfield1|textfield2。也许不是很好,但这对我有用。
- @PiTheNumber 复选框等是表示,而不是值。因此,您不能使用分隔符存储它们。当然,您可以使用字符串表示并在每次需要访问字段时解析该字符串,但我想说创建一个package器对象会更容易编写、理解和维护。
您的 Renderer 类将必须返回一个父组件(如 uhm 所说,可能是一个 JPanel),您在该组件上还有其他对象:复选框、文本字段等。您的 tableModel 必须保存 Renderer 用来描绘的值这些组件中的每一个。例如,模型可能设置有一个数据对象列表,列表中的每个条目都包含一个布尔值以指示是否选中了复选框,一个文本字段数据的字符串等。你不能让一个表格直观地描绘一个有用的如果关联模型没有将其存储在某个地方,则摆动对象。
来源:https://www.codenong.com/8340061/