1

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

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

  • 优点:允许我选择行的任何部分(在我的情况下不是必需的),可能是 Swing打算让事件在JTable
  • 缺点:我必须创建一个自定义类来处理这个并重现代码。

例子:

class Selector implements ListSelectionListener {
    @Override
    public void valueChanged(ListSelectionEvent event) {
        // ... write the action code here
    }
}

JButton & Action :我渲染一个JButton并添加Action一个JButton

  • 优点:我可以重复使用它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. 有什么方法可以Action在 a 中使用 sListSelectionListener吗?

4

1 回答 1

2

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

1) 我不会使用 ListSelectionListener。一些用户倾向于通过箭头键滚动表格。我不希望我的听众仅仅因为用户使用箭头键“滚动”而触发。但是,我已经将它用于一些特定的、不太常见的情况。

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

编辑:

这是来自 Rob Camick 网站的解决方案:Table Button Column

并在此处进行简短讨论:向 JTable 添加按钮

于 2013-02-19T19:02:38.887 回答