可编辑的JTable教程

时间:2008-09-17 16:29:40

标签: java swing jtable

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

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

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

6 个答案:

答案 0 :(得分:31)

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

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

编辑

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

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

请注意,在EventListeners个编辑器和编辑器内接收活动!可以使用渲染器显示按钮。但是要获得一个正常运行的按钮,您需要使用正确的getTableCellRendererComponent注册实现编辑器。在渲染器上注册侦听器不会做任何事情。

渲染器

对于您在问题中描述的内容,实现渲染器并不是绝对必要的,但无论如何,如果仅进行微小修改,您通常最终会执行渲染。与编辑不同,渲染器对速度至关重要。 对于表格中的每个单元格,一次为渲染器调用setText(...)渲染器返回的组件仅用于绘制单元格,而不是用于交互,因此可以“重用” “为下一个细胞。换句话说,你应该在渲染器中调整组件(例如,使用setFont(...)TextComponent,如果它是JTable),你应该实例化一个新的一个 - 这是削弱绩效的简单方法。

注意事项

请注意,要使渲染器和编辑器正常工作,您需要告诉JTable何时使用某个渲染器/编辑器。基本上有两种方法可以做到这一点。您可以使用相应的TableModel方法为特定类型设置默认单元格渲染器/编辑器。要使这种方式有效,您的getColumnClass(...)需要在Object.class方法中准确返回此类型!默认表格模型将为您执行此操作,它始终返回TableColumn。我敢肯定,有人困扰了很多人。

设置编辑器/渲染器的另一种方法是在列本身上明确设置它,即通过getTableColumn(...)的{​​{1}}方法获取JTable。这是更精细的,但是,它也是为单个类提供两个不同的渲染器/编辑器的唯一方法。例如。您的模型可能有两列String类,它们以完全不同的方式呈现,可能一次使用JLabel/DefaultRenderer,另一列使用JButton来访问更精细的编辑器。

JTable及其自定义渲染器和编辑器极其多功能,但它也需要很多东西,并且有很多事情要做错。祝你好运!

How to Use Tables中的{p> The Swing Tutorial是任何自定义JTable的人必读的。特别是,阅读并重读Concepts: Editors and Renderers,因为它通常需要一段时间才能“点击”。自定义渲染器和编辑器的示例也非常值得。

答案 1 :(得分:1)

要扩展以创建自己的行为的类是DefaultTableModel。这将允许您定义自己的行为。可以找到一个体面的教程on sun's site

答案 2 :(得分:1)

来自java lobby的本教程很容易理解。您引用的在线Swing trail for JTable表示它已更新。您是否已经扫描了整个事情以获得更好的信息(并不是更新的更好)?

答案 3 :(得分:1)

如果您尝试使用包含1列可编辑的简单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

答案 4 :(得分:0)

一些有用的课程是:

Package javax.swing.table

TableModel - tablemodel的界面 AbstractTableModel - 扩展用于使用自定义数据结构创建自己的表的好类 DefaultTableModel - 可以处理arrays[]Vectors

的默认表格模型

要禁用任何单元格的编辑,您需要覆盖isCellEditable(int row, int col)方法

答案 5 :(得分:0)

在你的表模型中,你应该覆盖" isCellEditable"和" setValueAt"功能,如下所示 第4列是可编辑单元格的列。
然后当你双击单元格并键入内容时,
将调用setValueAt()并将值保存到tableModel的DO,字段col4。

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 {
    }
}