Java Swing组件:表格

2024-06-20 1289阅读

       表格(JTable)是将数据以二维的形式展示给用户,它包括行和列,每一行表示一个对象,例如一个学生,每一列表示对象的一种属性,例如学生的学号、姓名等。表格组件是采用MVC(Model View Controller)模式进行设计,按照MVC的设计理念,JTable类属于视图,对应的数据模型是TableModel接口的实现类,用户可以根据自己的业务逻辑和数据结构来实现TableModel接口。在Swing中,抽象类AbstractTableModel是TableModel接口的一个实现类,它提供了TableModel接口的默认实现。在实际应用中,一般使用默认的数据模型DefaultTableModel来存储和管理表格的数据,该类是AbstractTableModel类的子类,它提供了常见的表格操作,例如,添加、修改、删除表格的数据等。由于表格的结构和功能比较复杂,因此,Swing中使用TableColumnModel接口的实现类来管理表格的列模型,使用ListSelectionModel接口的实现类来管理表格的选择模型。用户可以根据自己的需求来实现TableColumnModel和ListSelectionModel接口,也可以使用默认的列模型DefaultTableColumnModel(该类是TableColumnModel接口的实现类)和默认的选择模型DefaultListSelectionModel(该类是ListSelectionModel接口的实现类)来管理表格中列以及行和列的选择。

       JTable类的常用构造方法如下:

  • JTable():使用默认的数据模型、默认的列模型和默认的选择模型创建表格。
  • JTable(int numRows, int numColumns):使用DefaultTableModel创建具有指定行数和列数的表格。
  • JTable(Object[][] numRows, int numColumns):通过指定的二维组数和列名创建表格。
  • JTable(TableModel dm):通过指定的数据模型、默认的列模型和默认的选择模型创建表格。
  • JTable(TableModel dm, TableColumnModel cm):通过指定的数据模型、指定的列模型和默认的选择模型创建表格。
  • JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm):通过指定的数据模型、指定的列模型和指定的选择模型来创建表格。

           JTable类提供的方法非常多,限于篇幅,在这里只介绍几个常用的方法:

    • int getSelectedRow():返回第一个被选定行的索引,如果未选择任何行,则返回-1。
    • int[] getSelectedRows():返回所有选定行的索引。
    • int getSelectedRowCount():返回所选定行的数量。
    • Object getValueAt(int row,int column):返回指定单元格的值。

             创建表格一般先使用DefaultTableModel类的构造方法创建表格的数据模型,然后使用JTable类的构造方法创建表格并与数据模型进行关联。DefaultTableModel类的主要构造方法如下:

      • DefaultTableModel(Object[][] data, Object[] columnNames):通过指定二维组数和列名创建表格的数据模型。
      • void addRow(Object[] rowData):在数据模型的末尾添加一行。
      • void insertRow(int row, Object[] rowData):在数据模型中插入一行。
      • void setValueAt(Object aValue, int row, int column):设置单元格的对象值。
      • void removeRow(int row):从数据模型中删除一行。

               为了使表格能够对数据进行排序,必须将RowSorter类和JTable进行关联。RowSorter是一个抽象类,它负责将JTable中的数据映射成可排序的数据。在实际应用中,一般使用RowSorter的子类TableRowSorter与JTable进行关联。

        【例1】下面程序使用指定的数据模型创建一个具有排序功能的表格,并对表格中的数据进行增加、修改和删除操作,其中,增加和修改功能是通过一个对话框来完成的。

        import java.awt.*;
        import java.awt.event.*;
        import javax.swing.*;
        import javax.swing.table.*;
        public class JTableDemo extends JFrame{
        	Object[][] data= {};//表格的数据
            String columnNames[]= {"课程代码","课程名称","学分","学时"};//表格的列
            DefaultTableModel tableModel;//表格的数据模型
            JTable table; //表格
            JButton addButton=new JButton("增加");
        	JButton editButton=new JButton("修改");
        	JButton deleteButton=new JButton("删除");
        	public JTableDemo() {
        		JFrame frame=this;
        		setTitle("表格示例");
        		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        		setLocationRelativeTo(null);
        		setSize(400,300);
        		Container contentPane=this.getContentPane();
        		tableModel=new DefaultTableModel(data,columnNames);//创建数据模型
        		table=new JTable(tableModel);//创建表格,关联数据模型
        		RowSorter sorter=new TableRowSorter(tableModel);//创建表格行排序
        		table.setRowSorter(sorter);//设置表格行排序
        		JPanel panel=new JPanel();
        		panel.add(addButton);
        		panel.add(editButton);
        		panel.add(deleteButton);
        		contentPane.add(new JLabel("课程信息"),BorderLayout.NORTH);
        		contentPane.add(new JScrollPane(table),BorderLayout.CENTER);
        		contentPane.add(panel,BorderLayout.SOUTH);
        		//增加按钮注册事件监听器
        		addButton.addActionListener(new ActionListener() {
        			public void actionPerformed(ActionEvent e) {
        				new AddDialog(frame,tableModel,-1);
        			}
        		});
        		//修改按钮注册事件监听器
        		editButton.addActionListener(new ActionListener() {
        			public void actionPerformed(ActionEvent e) {
        				int row=table.getSelectedRow();//获取被选中的行号
        				if(row!=-1) {
        					new AddDialog(frame,tableModel,row);
        				}
        			}
        		});
        		//删除按钮注册事件监听器
        		deleteButton.addActionListener(new ActionListener() {
        			public void actionPerformed(ActionEvent e) {
        				int[] rows=table.getSelectedRows();//获取所有被选中的行号
        				if(rows.length>0) {
        					for(int i=0;i
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]