11

有没有好书或网站可以创建一个JTable? 我想让一列可编辑。我想实际上将一个继承的JCheckBox组件(我们在此处创建)放入其中一个表列中,而不是仅仅JCheckBox基于它是一个可编辑boolean字段而将表放入其中。

我有JFC Swing 教程第二版书,但我只是想知道是否有其他示例可以查看并学习如何更好地处理表格。这本书似乎只是将java'trail'放在网上并将其放入书中。

不过,我正在重新阅读这些东西,只是好奇是否有人发现了一些可能会有所帮助的东西。

4

6 回答 6

31

要使列可编辑,您必须覆盖isCellEditable. TableModel如果您继承,则创建 aTableModel相当容易AbstractTableModel,除了最简单JTable的 s 之外,我会推荐它。

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

编辑

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

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

请注意,在JTable编辑器中,只有编辑器才能接收事件!可以使用渲染器来显示按钮。但是要获得功能正常的按钮,您需要实现一个正确EventListeners注册的编辑器。在渲染器上注册一个监听器什么都不做。

渲染器

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

注意事项

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

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

JTable它的自定义渲染器和编辑器非常通用,但它也有很多需要考虑的地方,而且有很多事情要做错。祝你好运!

任何自定义 JTables 的人都必须阅读如何使用Swing 教程中的表格。特别是,阅读和重新阅读概念:编辑器和渲染器,因为它通常需要一段时间才能“点击”。自定义渲染器和编辑器的示例也非常值得。

于 2008-09-19T20:35:33.527 回答
1

您想要研究扩展以创建自己的行为的类是 DefaultTableModel。这将允许您定义自己的行为。在 sun 的网站上可以找到一个不错的教程。

于 2008-09-17T16:41:49.870 回答
1

这个来自java 大厅的教程很容易理解。您引用的 JTable的在线Swing 跟踪表明它已更新。您是否浏览了整个事情以获得可能更好(不是更新总是更好)的信息?

于 2008-09-17T16:55:17.233 回答
1

如果您尝试使用JTable具有 1 列可编辑的简单并且您知道列位置,您可以始终使用默认表模型并重载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
于 2008-09-22T19:36:40.897 回答
0

一些有用的类是:

Package javax.swing.table

TableModel- 一个接口tablemodel AbstractTableModel- 很好的类来扩展以使用自定义数据结构创建您自己的表 DefaultTableModel- 可以处理arrays[]和处理的默认表模型Vectors

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

于 2008-09-19T19:56:15.993 回答
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 {
    }
}
于 2016-09-05T10:09:47.803 回答