【问题标题】:AbstractTableModel and cell editorAbstractTableModel 和单元格编辑器
【发布时间】:2013-04-07 21:41:25
【问题描述】:

我发现的例子: 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());

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

【问题讨论】:

  • that i need to use AbstractTableModel instead of DefaultTableModel 请问为什么,有什么特殊的理由来限制某些东西,覆盖直接在DeafultTableModel1. 中作为方法实现的任何内容,这里有一堆关于如何编写 AbstractTableModel,@987654328 的问答@鼠标点击你问题下的AbstractTableModel标签,3.搜索Java & Swing & JTable & AbstractTableModel,4.阅读Oracle教程如何使用表格

标签: java swing tablecelleditor abstracttablemodel


【解决方案1】:

确保覆盖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;
    }
}

【讨论】:

  • 覆盖 AbstractTableModel.isCellEditable 解决了我的问题。感谢您的宝贵时间。
猜你喜欢
  • 2010-11-16
  • 2014-11-08
  • 2018-06-20
  • 2011-09-27
  • 2014-02-22
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多