可编辑的JTable教程

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

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

我正在重新阅读这些东西,只是好奇是否有人找到了可能有助于更多的东西。

要使列可编辑,您必须覆盖TableModelisCellEditable方法。 如果你inheritance了AbstractTableModel ,那么创建一个TableModel是相当容易的,除了最简单的JTable我会推荐它。

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

编者

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

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

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

渲染器

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

注意事项

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

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

JTable及其自定义渲染器和编辑器非常通用,但它也有很多东西可以接受,并且有很多事情要做错。 祝你好运!

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

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

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

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

一些有用的类是:

Package javax.swing.table

TableModeltablemodel接口AbstractTableModel – 扩展用于使用自定义数据结构创建自己的表的Nice类DefaultTableModel – 可以处理arrays[]Vectors默认表模型

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

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

 public ArrayList tbmData = new ArrayList(); //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 { } }