JTable 中的从属列
嗨! 我有一个 JTable。此 JTable 的列由 JComboBox 呈现。 我希望能够根据第 1 列中选择的值更改第 2 列的项目。
例如,如果用户在第 1 列中选择 Microsoft,那么在第 2 列中他/她可以选择 ado、wpf 等。
是吗?可能的 ? 如果可能的话,应该监听哪些事件呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
组合框表格编辑器提供了一种可能的解决方案为了这。
The Combo Box Table Editor provides one possible solution for this.
也许你可以基于这段代码;
这是一个有趣的页面:点击
Maybe you can base you on this code;
This is an intresting page: click
只需创建您自己的 TableCellEditor,在调用 getTableCellEditorComponent 时准备 JComboBox 的模型即可。像这样的东西:
Just make your own TableCellEditor that preps the JComboBox's model on the call to getTableCellEditorComponent. Something like this:
您在
TableModel
中使用什么作为值?一种解决方案是定义一个类,例如
CategoryValue
,它表示可能的项目和选定项目的列表,并使用它;然后监听TableModelEvents
,当第0列中的值发生变化时,在第1列中设置相应的值。下面是一个简单的示例。首先,
TableModelListener
:(实现
getChildCategories(String)
取决于数据的来源,但它可以像Map>
。)接下来是值类:
最后,值类的自定义单元格编辑器:
所有这些都通过一个事件侦听器完成,一个不错的好处是该事件侦听器不关心如何表被编辑/更新,或者编辑/更新来自哪里。
编辑添加:或者,用一些业务对象来表示表的每一行,该业务对象捕获针对特定行所做的所有选择,并让
CellEditor
从业务对象(使用getTableCellEditorComponent()
的row
参数来获取业务对象)。事件机制将保持不变。这样做的优点是,从业务对象中读取所选值可能比抓取表更容易。What are you using as values in your
TableModel
?One solution would be to define a class, say
CategoryValue
, that represents a list of possible items and a selected item, and use that; then listen forTableModelEvents
and when a value in column 0 changes, set the corresponding value in column 1. A simple example is below.First, the
TableModelListener
:(Implementing
getChildCategories(String)
depends on where your data is coming from, but it could be as simple as aMap<String, List<String>>
.)Next, the value class:
Finally, a custom cell editor for the value class:
All done with one event listener, and a nice bonus is that that event listener doesn't care how the table is edited/updated, or where the edits/updates come from.
Edited to add: Alternatively, represent each row of the table with some business object that captures all the choices made for a particular row, and have the
CellEditor
get the available choices from the business object (using therow
argument togetTableCellEditorComponent()
to get the business object). The event mechanism would remain the same. This has the advantage that it's probably easier to read the selected values from the business object than to scrape the table.