在JTable中使用JButton&Action有什么缺点?



我有一个带有自定义渲染器的JTable。当单击JTable中的一个项目时,我会执行一组影响我的模型的特定操作。我有两个选择来实现它:

ListSelectionListener:我在我的整个JTable上添加了一个侦听器,当单击一行时会触发它。然后我执行动作。

  • 优点:允许我选择行的任何部分(在我的情况下不是必需的),可能是SwingJTable中激发事件的方式
  • 缺点:我必须创建一个自定义类来处理这个问题并重新生成代码

示例:

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;
    }
}
  1. 如果我使用第二种解决方案,火会从天上降下来吗?

  2. 它们都同样可行吗?

  3. 有没有办法在ListSelectionListener中使用Action

在不了解特定用例的情况下,我的想法是:

1) 我不会使用ListSelectionListener。有些用户倾向于通过箭头键在表格中滚动。我不希望我的监听器仅仅因为用户在用箭头键"滚动"而被解雇。然而,我在一些具体的、不太常见的情况下使用了这个。

2) 我会使用渲染器在单元格中显示一个JButton,然后在表上添加一个MouseListener。将mouseClicked事件的坐标转换为表格单元格。如果单元具有ButtonRenderer,则激发相应的代码。这更有可能过滤掉不需要的操作,因为点击特定单元格更有可能是用户有意的操作。

编辑:

以下是Rob Camick网站的解决方案:表按钮列

这里有一个简短的讨论:向JTable 添加按钮

相关内容

  • 没有找到相关文章

最新更新