我有一个带有自定义渲染器的JTable
。当单击JTable
中的一个项目时,我会执行一组影响我的模型的特定操作。我有两个选择来实现它:
ListSelectionListener:我在我的整个JTable
上添加了一个侦听器,当单击一行时会触发它。然后我执行动作。
- 优点:允许我选择行的任何部分(在我的情况下不是必需的),可能是Swing在
JTable
中激发事件的方式 - 缺点:我必须创建一个自定义类来处理这个问题并重新生成代码
示例:
class Selector implements ListSelectionListener {
@Override
public void valueChanged(ListSelectionEvent event) {
// ... write the action code here
}
}
JButton&操作:我渲染了一个JButton
,并向该JButton
添加了Action
。
- 优点:我可以重用那个
Action
,如果我更改那个Action
,所有使用它的实例都会更新 - 缺点:我将逻辑转移到渲染代码中
示例:
class Renderer implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int col) {
JButton btn = new JButton(value.toString());
btn.setAction(new SpecificAction());
return btn;
}
}
如果我使用第二种解决方案,火会从天上降下来吗?
它们都同样可行吗?
有没有办法在
ListSelectionListener
中使用Action
?
在不了解特定用例的情况下,我的想法是:
1) 我不会使用ListSelectionListener。有些用户倾向于通过箭头键在表格中滚动。我不希望我的监听器仅仅因为用户在用箭头键"滚动"而被解雇。然而,我在一些具体的、不太常见的情况下使用了这个。
2) 我会使用渲染器在单元格中显示一个JButton,然后在表上添加一个MouseListener。将mouseClicked事件的坐标转换为表格单元格。如果单元具有ButtonRenderer,则激发相应的代码。这更有可能过滤掉不需要的操作,因为点击特定单元格更有可能是用户有意的操作。
编辑:
以下是Rob Camick网站的解决方案:表按钮列
这里有一个简短的讨论:向JTable 添加按钮