有没有什么好的书籍或网站可以介绍如何创建 JTable?我想让一列可编辑。我实际上想继承一个 JCheckBox 组件(我们在此处创建的)放入表列之一,而不是仅仅将表放入 JCheckBox 基于它是可编辑的 boolean 场地。

我有 JFC Swing 教程第二版 书,但我只是想知道是否还有其他示例可以查看并学习如何更好地处理表格。这本书似乎只是把网上的java‘踪迹’放到了书中。

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

有帮助吗?

解决方案

要使列可编辑,您必须覆盖 isCellEditable 方法中的 TableModel. 。创建一个 TableModel 如果你继承的话相当容易 AbstractTableModel 我会向所有人推荐它,除了最简单的 JTables。

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

编辑

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

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

请注意,在一个 JTable 编辑和 仅有的 编辑收到活动!显示按钮可以使用渲染器来完成。但要获得一个功能按钮,您需要实现一个具有正确功能的编辑器 EventListeners 挂号的。在渲染器上注册侦听器不会执行任何操作。

渲染器

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

注意事项

请注意,为了使渲染器和编辑器正常工作,您需要告诉 JTable 何时使用特定的渲染器/编辑器。基本上有两种方法可以做到这一点。您可以设置默认的单元格渲染器/编辑器 对于某种类型 使用各自的 JTable 方法。要以这种方式工作,您的 TableModel 需要在中返回这个类型 getColumnClass(...) 方法!默认表模型将 不是 为你做这件事,它总会回报 Object.class. 。我相信这一点已经难倒了很多人。

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

JTable 及其自定义渲染器和编辑器是 极其 多才多艺,但要吸收的东西也很多,做错的事情也很多。祝你好运!

如何使用表格摇摆教程 对于任何定制 JTables 的人来说都是必读的。特别是,阅读并重读 概念:编辑器和渲染器 因为它通常需要一段时间才能“点击”。关于自定义渲染器和编辑器的示例也非常有价值。

其他提示

您想要扩展以创建您自己的行为的类是 DefaultTableModel。这将使您能够定义自己的行为。可以找到一个不错的教程 在太阳网站上.

本教程来自 爪哇大厅 很容易遵循。在线的 JTable 的 Swing 轨迹 您引用的内容表明它已更新。您是否浏览了整个内容以获取可能更好(不是越新越好)的信息?

如果您尝试使用简单的 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

一些有用的类是:

Package javax.swing.table :

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

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

在表模型中,您应该覆盖“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 {
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top