`

JTable的事件处理

阅读更多

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

分享到:
评论

相关推荐

    Java Swing实现JTable检测单元格数据变更事件的方法示例

    在其事件处理函数 tableChanged 中,我们可以通过 e.getColumn(),e.getFirstRow(),e.getLastRow(),e.getType() 来获取变更发生的位置和变更的类型(插入、更新或删除)。 然而,该方法存在两个致命的问题: 1. ...

    JTable 练习例子exa

    为了使`JTable`更具交互性,开发者还可以使用`MouseListener`和`KeyBindings`来处理用户的鼠标点击和键盘输入事件。`ActionListener`则可以用来处理表格中的按钮或菜单项的点击事件。 总的来说,这个"JTable 练习...

    JTable添加CheckBox

    这通常意味着我们需要重写`getValueAt()`和`setValueAt()`方法,以处理`Boolean`类型的值,因为`CheckBox`表示的是布尔状态。 ```java public class CheckTableModle extends AbstractTableModel { // ... 数据...

    Jtable 中放入多个按钮

    在Java Swing库中,`JTable`是一个非常重要的组件,用于展示二维数据表格。...记住,自定义组件和事件处理是Swing编程中常见且重要的技能,熟练掌握这些技巧可以帮助你构建更加灵活和用户友好的应用。

    jtable详解

    以下是对`JTable`的深入解析,包括其构造、属性、事件处理以及如何在实际项目中应用。 #### 类层次结构 `JTable`继承自`JComponent`,其类层次结构如下: ``` java.lang.Object -- java.awt.Component -- java....

    JAVA中JTable的使用方法

    `JTable`支持多种事件监听,如`TableModelListener`用于监听数据变化,`MouseListener`和`MouseMotionListener`用于处理鼠标操作,`ListSelectionListener`用于监听行选择。 6. **定制外观** 可以通过`setRow...

    JTable示例源码(Swing demo)

    `JTable`还提供了其他事件处理,如`MouseListener`用于处理鼠标点击事件,`ActionListener`处理单元格编辑的确认操作等。这些事件处理机制使得用户与表格的交互更加丰富和灵活。 在`TableModelTest`这个源码文件中...

    不错的jquery插件jtable

    jtable 提供丰富的定制选项,如自定义主题、操作列、事件监听等,可以满足不同项目的需求。同时,通过扩展插件或自定义功能,可以进一步增强 jtable 的功能。 总结,jtable 是一个功能强大且易于使用的 jQuery 插件...

    java中JTable的应用】.pdf

    JTable与事件处理机制的结合,使得开发者能够为用户提供交互式体验。 ### GUI设计和布局管理 为了创建美观的用户界面,开发者需要设计布局并管理GUI组件的布局。文档中的代码片段提到了使用布局管理器(如`...

    JTable的介绍.doc

    `JTable`能够处理表格数据的显示、编辑以及用户交互。 `JTable`的主要构造函数有以下几个: 1. `JTable()`: 创建一个使用系统默认`Model`的新`JTable`。 2. `JTable(int numRows, int numColumns)`: 创建一个指定...

    java jtable

    4. 事件处理:通过注册TableCellEditor和TableCellRenderer,可以自定义单元格的显示和编辑行为。 5. 数据排序:通过DefaultRowSorter,可以实现表格数据的排序。 6. 鼠标和键盘事件:监听鼠标点击和键盘输入,实现...

    Excel内容复制到JTable中

    当我们需要从Excel文件中读取数据并展示在JTable上时,就需要进行一系列的处理步骤。以下是一些关于如何实现这个过程的关键知识点: 1. **Excel文件处理**: - **Apache POI库**:在Java中,我们通常使用Apache ...

    mvc+Jquery-jTable

    `jQuery` 是一个流行的JavaScript库,简化了HTML文档遍历、事件处理、动画和Ajax交互。它大大降低了前端开发的复杂度,提高了开发效率。 `jTable` 是一个基于jQuery的开源插件,用于在Web应用中创建数据表。它提供...

    JAVA表格控件JTable常用操作详解.doc

    除了以上的基本操作,JTable还支持其他高级特性,如监听单元格更改事件(`CellEditorListener`)、自定义单元格渲染(`TableCellRenderer`)和编辑器(`TableCellEditor`),以及表格选择和排序等。这些特性使得...

    学会JTable的使用

    `TestJTable.java`可能是一个测试类,用于验证`JTable`的功能,包括数据绑定、事件处理等。 `.mdb`文件是Access数据库文件,可能被用作`JTable`的数据源。在Java中,可以通过JDBC连接Access数据库,获取数据并填充...

    复杂JTable-跨列表头

    实现跨列表头涉及的主要技术包括Swing的自定义组件、UI委托、渲染器以及事件处理。开发者需要深入理解Swing组件模型,才能有效地扩展和定制JTable的行为。在实际应用中,这样的功能可以显著提高用户体验,尤其是在...

    JTable增删改查

    - **监听事件**:为`JTable`添加事件监听器,如`MouseListener`和`KeyListener`,以便在用户进行操作时响应。 - **处理操作**:在监听器中,根据用户的操作(如点击行或按下按键)执行相应的SQL操作。 **8. 异常...

    Java JTree+JTable应用

    这可能涉及到监听`JTree`的选择事件,然后根据选中节点的数据生成`JTable`的行。这通常通过实现`TreeSelectionListener`接口并重写`valueChanged`方法来完成。 `JTextPane`和`JSplitPane`是额外提及的两个组件。`...

    Swing之JTable的详细介绍

    6. `JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm)`: 除了`TableModel`和`TableColumnModel`外,还指定了`ListSelectionModel`用于处理行选择。 7. `JTable(Vector rowData, Vector column...

Global site tag (gtag.js) - Google Analytics