1

我找到的示例: http ://www.java2s.com/Code/Java/Swing-Components/ButtonTableExample.htm 展示了如何创建具有指定列(按钮)的 JTable。它工作正常,但我的问题是,我需要使用 AbstractTableModel 而不是 DefaultTableModel (如示例所示)。

所以我创建了自己的 TableModel,它扩展了 AbstractTableModel:

public class TableModel extends AbstractTableModel { //..
}

并替换:

 DefaultTableModel dm = new DefaultTableModel();
dm.setDataVector(new Object[][] { { "button 1", "foo" },
    { "button 2", "bar" } }, new Object[] { "Button", "String" });

JTable table = new JTable(dm);

为了:

JTable table = new JTable(new TableModel());

然后什么也没有发生,当我单击某行的按钮时。有什么建议么?

4

1 回答 1

4

确保使用按钮覆盖AbstractTableModel.isCellEditable返回true列的方法,否则不会触发编辑器。此方法默认返回false.

此外,请确保您覆盖getColumnName()以返回正确的名称,因为您链接的示例尝试查找名称为“Button”的列来设置编辑器。

您可能会发现@camickr的Table Button Column实现很有用。

此演示模型适用于链接示例中的编辑器和渲染器:

public class DemoTableModel extends AbstractTableModel {
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return (columnIndex == 0);
    }

    @Override
    public int getRowCount() {
        return 2;
    }

    @Override
    public int getColumnCount() {
        return 2;
    }

    @Override
    public String getColumnName(int columnIndex) {
        switch (columnIndex) {
        case 0:
            return "Button";
        case 1:
            return "Value";
        }
        return null;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        switch (columnIndex) {
        case 0:
            return "Button";
        case 1:
            return "Value";
        }
        return null;
    }
}
于 2013-04-07T22:08:46.303 回答