Java 可编辑JTable教程

Java 可编辑JTable教程,java,swing,jtable,Java,Swing,Jtable,有没有好的书籍或网站可以创建一个JTable?我想使一列可编辑。实际上,我想将继承的JCheckBox组件(我们在这里创建的)放入一个表列中,而不是仅仅将表放入JCheckBox,因为它是一个可编辑的布尔字段 我有这本书,但我只是想知道是否还有其他的例子,我可以看看,并学习如何更好地处理表格。这本书似乎只是把java的“轨迹”放到了网上,并把它放到了书中 不过,我正在重新阅读这些内容,只是好奇是否有人找到了可能更有用的东西。您希望扩展以创建自己行为的类是DefaultTableModel。这将允

有没有好的书籍或网站可以创建一个
JTable
?我想使一列可编辑。实际上,我想将继承的
JCheckBox
组件(我们在这里创建的)放入一个表列中,而不是仅仅将表放入
JCheckBox
,因为它是一个可编辑的
布尔
字段

我有这本书,但我只是想知道是否还有其他的例子,我可以看看,并学习如何更好地处理表格。这本书似乎只是把java的“轨迹”放到了网上,并把它放到了书中


不过,我正在重新阅读这些内容,只是好奇是否有人找到了可能更有用的东西。

您希望扩展以创建自己行为的类是DefaultTableModel。这将允许你定义自己的行为。您可以找到一个不错的教程。

本教程来自于,很容易理解。您引用的联机文件表示该文件已更新。您是否浏览了整个内容以寻找可能更好的信息(更新并非总是更好的信息?

一些有用的类包括:

包javax.swing.table

TableModel
-用于
TableModel
AbstractTableModel
-很好的扩展类,用于使用自定义数据结构创建自己的表
DefaultTableModel
-可以处理
数组[]
向量的默认表模型


要禁用对任何单元格的编辑,需要覆盖
isCellEditable(int行,int列)
方法

要使列可编辑,必须覆盖
TableModel
中的
isCellEditable方法。如果您继承了
AbstractTableModel
,那么创建
TableModel
是相当容易的,除了最简单的
JTable
s之外,我建议您使用它

但是,调整
表格模型
只是您需要做的一部分。要在
JTable
中实际获取自定义组件,需要设置自定义单元渲染器。要使用交互式自定义组件,需要设置自定义单元编辑器。在某些情况下,使用稍微修改过的默认类版本就足够了

编辑

如果您已经拥有一个自定义组件,那么可以使用委托轻松完成:创建一个实现
TableCellEditor
的新类,并在
getCellEditorComponent
方法中返回该组件的新实例。此方法的参数包括当前值、单元坐标、返回表格的链接以及是否选择单元

TableCellEditor
还有一个方法,当用户提交对单元格内容的更改(您可以在其中验证用户输入并调整模型)或取消编辑时,会调用该方法。如果您曾经以编程方式中止编辑,请确保在编辑器上调用
stopEditing()
方法,否则编辑器组件将保持在屏幕上——这曾经花了我2个小时的时间进行调试

请注意,在
JTable
编辑器中,只有编辑器接收事件!可以使用渲染器显示按钮。但要获得一个功能正常的按钮,您需要实现一个具有正确注册的
EventListeners
的编辑器。在渲染器上注册侦听器没有任何作用

渲染器

对于您在问题中所描述的内容,实现渲染器并不是绝对必要的,但您通常最终都会这样做,即使只是为了一些小的修改。与编辑器不同,渲染器的速度至关重要。对于表中的每个单元格,渲染器的
getTableCellRenderComponent
将被调用一次!渲染器返回的组件仅用于绘制单元,不用于交互,因此可以“重用”下一个单元。换句话说,您应该在渲染器中调整组件(例如,使用
setText(…)
setFont(…)
如果它是
TextComponent
),您不应该实例化一个新组件——这是削弱性能的简单方法

警告

请注意,为了使渲染器和编辑器能够工作,您需要告诉
JTable
何时使用特定的渲染器/编辑器。基本上有两种方法可以做到这一点。可以使用相应的
JTable
方法为特定类型设置默认单元格渲染器/编辑器。为了使这种方法有效,您的
TableModel
需要在
getColumnClass(…)
方法中准确返回此类型!默认表模型不会为您执行此操作,它总是返回
Object.class
。我敢肯定,这件事已经难倒了很多人

设置编辑器/渲染器的另一种方法是在列本身上显式设置它,即通过
JTable
getTableColumn(…)
方法获取
TableColumn
。这要复杂得多,但是,这也是为单个类使用两个不同的渲染器/编辑器的唯一方法。例如,您的模型可能有两列类字符串,它们以完全不同的方式呈现,可能一次使用
JLabel/DefaultRenderer
,另一次使用
JButton
访问更精细的编辑器

JTable
带有自定义渲染器和编辑器,功能极其广泛,但也有很多地方需要使用,而且有很多地方需要出错。祝你好运


in是任何定制JTables的人的必读资料。特别是,读取和重新读取,因为它通常需要一段时间才能“单击”。自定义渲染器和编辑器上的示例也很有价值。

如果您试图使用一个简单的
JTable
,其中有一列是可编辑的,并且您知道列的位置,那么您可以始终使用默认表模型并重载
isCellEditable
调用

大概是这样的:

myTable.setModel(new DefaultTableModel(){
@Override
public boolean isCellEditable(int row, int column) {
    if (column == x) {
        return true;
    } else
        return false;
}
});
对于复选框,创建渲染器类

MyCheckBoxRenderer extends JCheckBox implements TableCellRenderer
public ArrayList<XXXDO> tbmData = new ArrayList<XXXDO>(); //arraylist for data in table

@Override
public boolean isCellEditable(int row, int col) {
    if (col == 4) {
        return true;
    } else {
        return false;
    }
}

@Override
public void setValueAt(Object value, int row, int col) {
    if ((row >= 0) && (row < this.tbmData.size()) && (col >= 0) && (col < this.colNm.length)) {
        if (col == 4) {
            tbmData.get(row).col4= (String) value;
        }
        fireTableCellUpdated(row, col);
    } else {
    }
}