JTable的事件处理
在前面的介绍中,我们了解了数种在不同组件上的事件处理。同样,在JTable的事件大致均针对表格内容的异操作处理,包括字段内容改变,列数增加
或减少,行数增加或减少,或是表格的结构改变等等。这些事件我们称为TableModelEvent事件。要处理
TableModelEvent事件我们必须实现TableModelListener界面,此界面定义了一个方法,那就是tableChanged(),为了处理这些事件的种种
情况,在AbstractTableModel类中提供了下列方法来提示TableModelListener:表格内容已经改动了,如下所示:
1.fireTableCellUpdated():发出表格中的某一个字段已经更改的事件信息。
2.fireTableChanged():发出表格已经改动的事件信息。
3.fireTableDataChanged():发出表格中的某字段已经更改的事件信息。
4.fireTableRowsDeleted():发出表格中的某几行已经删除的事件信息。
5.fireTableRowsInserted():发出表格中的已经新增某几行的事件信息。
6.fireTableRowsUpdated():发出表格中的某几行已经修改的事件信息。
7.fireTableStructureChanged():发出表格结构已经改变的事件信息,这里指的结构改变可能包括表格的列数已经改变。
在知道在表格中可能发生的事件后,我们要如何拦截这些事件的信息呢?在AbstractTableModel类中提供了一个注册listener的方法
:addTableModelListener().在加入TableModelListener之后,我们就可以依照不同的事件做不同的处理了。
先来看看下面的例子吧,这个例子主要是更改本章的ColumnModelTest.java范例,再加上一些功能。在这个范例中,我们针对用户对
表格所做的修改加以处理,如果改的项目是数字,包括“语文”,“数学”字段,则我们直接将修改的值累加至"总分"字段,并检查其是
否及格且在“及格”字段作修改。
import javax.swing.table.AbstractTableModel;
import javax.swing.event.*;
import javax.swing.table.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class TableEventHandle implements TableModelListener
{
JTable table = null;
MyTable mt = null;
JLabel label = null; //显示修改字段位置
public TableEventHandle() {
JFrame f = new JFrame();
mt=new MyTable();
mt.addTableModelListener(this);
table=new JTable(mt);
JComboBox c = new JComboBox();
c.addItem("Taipei");
c.addItem("ChiaYi");
c.addItem("HsinChu");
table.getColumnModel().getColumn(1).setCellEditor(new DefaultCellEditor(c));
table.setPreferredScrollableViewportSize(new Dimension(550, 30));
JScrollPane s = new JScrollPane(table);
label = new JLabel("修改字段位置:");
f.getContentPane().add(s, BorderLayout.CENTER);
f.getContentPane().add(label, BorderLayout.SOUTH);
f.setTitle("TableEventHandle");
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public void tableChanged(TableModelEvent e)
{
int row = e.getFirstRow();
int column = e.getColumn();
label.setText("修改字段位置:"+(row+1)+" 行 "+(column+1)+" 列");
boolean cheat =((Boolean)(mt.getValueAt(row,6))).booleanValue();
int grade1=((Integer)(mt.getValueAt(row,2))).intValue();
int grade2=((Integer)(mt.getValueAt(row,3))).intValue();
int total = grade1+grade2;
if(cheat)
{
if(total > 120)
mt.mySetValueAt(new Integer(119),row,4);
else
mt.mySetValueAt(new Integer(total),row,4);
mt.mySetValueAt(new Boolean(false),row,5);
}
else
{
if(total > 120)
mt.mySetValueAt(new Boolean(true),row,5);
else
mt.mySetValueAt(new Boolean(false),row,5);
mt.mySetValueAt(new Integer(total),row,4);
}
table.repaint();
}
public static void main(String args[]) {
new TableEventHandle();
}
}
class MyTable extends AbstractTableModel {
Object[][] p = {
{"阿呆", "Taipei",new Integer(66), new Integer(32), new Integer(98),
new Boolean(false),new Boolean(false)},
{"阿瓜", "ChiaYi",new Integer(85), new Integer(69), new Integer(154),
new Boolean(true),new Boolean(false)}};
String[] n = {"姓名","居住地","语文","数学","总分","及格"};
public int getColumnCount() {
return n.length;
}
public int getRowCount() {
return p.length;
}
public String getColumnName(int col) {
return n[col];
}
public Object getValueAt(int row, int col) {
return p[row][col];
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
public void setValueAt(Object value, int row, int col) {
p[row][col] = value;
fireTableCellUpdated(row, col);
}
public void mySetValueAt(Object value, int row, int col) {
p[row][col] = value;
}
}
分享到:
相关推荐
在其事件处理函数 tableChanged 中,我们可以通过 e.getColumn(),e.getFirstRow(),e.getLastRow(),e.getType() 来获取变更发生的位置和变更的类型(插入、更新或删除)。 然而,该方法存在两个致命的问题: 1. ...
为了使`JTable`更具交互性,开发者还可以使用`MouseListener`和`KeyBindings`来处理用户的鼠标点击和键盘输入事件。`ActionListener`则可以用来处理表格中的按钮或菜单项的点击事件。 总的来说,这个"JTable 练习...
这通常意味着我们需要重写`getValueAt()`和`setValueAt()`方法,以处理`Boolean`类型的值,因为`CheckBox`表示的是布尔状态。 ```java public class CheckTableModle extends AbstractTableModel { // ... 数据...
5. JTable事件响应 JTable组件提供了多种事件响应机制,例如选中单元格、双击单元格、按下键盘等。这些事件可以通过JTable的API来捕获和处理。 6. 实践项目:Java连连看 Java连连看是一个基于JTable组件的游戏...
在Java Swing库中,`JTable`是一个非常重要的组件,用于展示二维数据表格。...记住,自定义组件和事件处理是Swing编程中常见且重要的技能,熟练掌握这些技巧可以帮助你构建更加灵活和用户友好的应用。
以下是对`JTable`的深入解析,包括其构造、属性、事件处理以及如何在实际项目中应用。 #### 类层次结构 `JTable`继承自`JComponent`,其类层次结构如下: ``` java.lang.Object -- java.awt.Component -- java....
`JTable`支持多种事件监听,如`TableModelListener`用于监听数据变化,`MouseListener`和`MouseMotionListener`用于处理鼠标操作,`ListSelectionListener`用于监听行选择。 6. **定制外观** 可以通过`setRow...
`JTable`还提供了其他事件处理,如`MouseListener`用于处理鼠标点击事件,`ActionListener`处理单元格编辑的确认操作等。这些事件处理机制使得用户与表格的交互更加丰富和灵活。 在`TableModelTest`这个源码文件中...
3. **事件处理**: 由于按钮是在单元格内的,所以点击按钮时的事件处理需要额外处理。你可以通过给每个按钮添加ActionListener,然后在监听器中判断点击的是哪个按钮。 4. **注意**: - 考虑到性能,你可能希望在...
jtable 提供丰富的定制选项,如自定义主题、操作列、事件监听等,可以满足不同项目的需求。同时,通过扩展插件或自定义功能,可以进一步增强 jtable 的功能。 总结,jtable 是一个功能强大且易于使用的 jQuery 插件...
JTable与事件处理机制的结合,使得开发者能够为用户提供交互式体验。 ### GUI设计和布局管理 为了创建美观的用户界面,开发者需要设计布局并管理GUI组件的布局。文档中的代码片段提到了使用布局管理器(如`...
当我们需要从Excel文件中读取数据并展示在JTable上时,就需要进行一系列的处理步骤。以下是一些关于如何实现这个过程的关键知识点: 1. **Excel文件处理**: - **Apache POI库**:在Java中,我们通常使用Apache ...
`JTable`能够处理表格数据的显示、编辑以及用户交互。 `JTable`的主要构造函数有以下几个: 1. `JTable()`: 创建一个使用系统默认`Model`的新`JTable`。 2. `JTable(int numRows, int numColumns)`: 创建一个指定...
4. 事件处理:通过注册TableCellEditor和TableCellRenderer,可以自定义单元格的显示和编辑行为。 5. 数据排序:通过DefaultRowSorter,可以实现表格数据的排序。 6. 鼠标和键盘事件:监听鼠标点击和键盘输入,实现...
`jQuery` 是一个流行的JavaScript库,简化了HTML文档遍历、事件处理、动画和Ajax交互。它大大降低了前端开发的复杂度,提高了开发效率。 `jTable` 是一个基于jQuery的开源插件,用于在Web应用中创建数据表。它提供...
除了以上的基本操作,JTable还支持其他高级特性,如监听单元格更改事件(`CellEditorListener`)、自定义单元格渲染(`TableCellRenderer`)和编辑器(`TableCellEditor`),以及表格选择和排序等。这些特性使得...
`TestJTable.java`可能是一个测试类,用于验证`JTable`的功能,包括数据绑定、事件处理等。 `.mdb`文件是Access数据库文件,可能被用作`JTable`的数据源。在Java中,可以通过JDBC连接Access数据库,获取数据并填充...
- **监听事件**:为`JTable`添加事件监听器,如`MouseListener`和`KeyListener`,以便在用户进行操作时响应。 - **处理操作**:在监听器中,根据用户的操作(如点击行或按下按键)执行相应的SQL操作。 **8. 异常...
这可能涉及到监听`JTree`的选择事件,然后根据选中节点的数据生成`JTable`的行。这通常通过实现`TreeSelectionListener`接口并重写`valueChanged`方法来完成。 `JTextPane`和`JSplitPane`是额外提及的两个组件。`...
6. `JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm)`: 除了`TableModel`和`TableColumnModel`外,还指定了`ListSelectionModel`用于处理行选择。 7. `JTable(Vector rowData, Vector column...