ButtonCellEditor不选择Jtable行

时间:2012-01-07 23:03:06

标签: swing jtable selection jbutton

我有一个JButton的自定义单元格渲染器和编辑器。我的问题是,如果我点击一个按钮,相应的行就不会被选中。

这是必需的,因为按钮的ActionListener需要获取所点击行的信息。

如何实现此行为?

编辑:

我有一个包含JTableDefaultListModel的课程。该表每行可视化一个Object。此外,每行包含使用下面的ButtonColumn实现的修改和删除按钮。行本身不包含实际数据 - 它只包含纯字符串。如果我现在点击Modify-或Delete-Button我想在真实对象上做一些事情(存储在interal ArrayList中) - 因此我需要点击按钮的行中的信息。

class ButtonColumn extends AbstractCellEditor implements TableCellRenderer,
                                                         TableCellEditor
{
    private JButton btRenderer = new JButton();
    private JButton btEdit     = new JButton();
    private String text;

    public ButtonColumn(ActionListener listener, String actionCommand)
    {
        btEdit.setFocusPainted(false);
        btEdit.addActionListener(listener);
        btEdit.setActionCommand(actionCommand);
    }

    public void addMouseListener(MouseListener listener)
    {
        btEdit.addMouseListener(listener);
    }

    @Override
    public Component getTableCellRendererComponent(JTable table,
                                                Object value,
                                                boolean isSelected,
                                                boolean hasFocus,
                                                int row,
                                                int column)
    {
        btRenderer.setText((value == null) ? "" : value.toString());
        return btRenderer;
    }

    @Override
    public Component getTableCellEditorComponent(JTable table,
                                                Object value,
                                                boolean isSelected,
                                                int row,
                                                int column)
    {
        text = (value == null) ? "" : value.toString();
        btEdit.setText(text);
        return btEdit;
    }

    @Override
    public Object getCellEditorValue()
    {
        return text;
    }
}

1 个答案:

答案 0 :(得分:-1)

我通过在我的ButtomCellRenderer / Editor中添加另一个自定义MouseListener来修复它,这是在表类中实现的。

@Override
public void mousePressed(MouseEvent e)
{
    clickedRowIndex = table.rowAtPoint(e.getPoint());
}

如果点击ButtonCell,我可以获取点击单元格的信息,并可以actionPerformed方法使用此信息。